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 { ...@@ -448,6 +448,13 @@ public class TabGroupModelFilter extends TabModelFilter {
return getRelatedTabList(group.getTabIdList()); 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) { private List<Tab> getRelatedTabList(List<Integer> ids) {
List<Tab> tabs = new ArrayList<>(); List<Tab> tabs = new ArrayList<>();
for (Integer id : ids) { for (Integer id : ids) {
......
...@@ -11,7 +11,6 @@ import android.view.View; ...@@ -11,7 +11,6 @@ import android.view.View;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModel; 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.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
...@@ -117,26 +116,14 @@ class TabSelectionEditorMediator ...@@ -117,26 +116,14 @@ class TabSelectionEditorMediator
@Override @Override
public void show() { public void show() {
mResetHandler.resetWithListOfTabs(getTabsToShow()); List<Tab> nonGroupedTabs = mTabModelSelector.getTabModelFilterProvider()
.getCurrentTabModelFilter()
.getTabsWithNoOtherRelatedTabs();
mResetHandler.resetWithListOfTabs(nonGroupedTabs);
mSelectionDelegate.setSelectionModeEnabledForZeroItems(true); mSelectionDelegate.setSelectionModeEnabledForZeroItems(true);
mModel.set(TabSelectionEditorProperties.IS_VISIBLE, 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 @Override
public boolean handleBackPressed() { public boolean handleBackPressed() {
if (!isEditorVisible()) return false; if (!isEditorVisible()) return false;
......
...@@ -654,4 +654,28 @@ public class TabGroupModelFilterUnitTest { ...@@ -654,4 +654,28 @@ public class TabGroupModelFilterUnitTest {
// Verify that the signal is not ignored. // Verify that the signal is not ignored.
verify(mTabGroupModelFilterObserver).didMoveTabOutOfGroup(mTab3, POSITION2); 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 ...@@ -268,6 +268,13 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
if (!FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled() if (!FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()
|| DeviceClassManager.enableAccessibilityLayout()) { || DeviceClassManager.enableAccessibilityLayout()) {
menu.findItem(R.id.menu_group_tabs).setVisible(false); 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 ...@@ -84,6 +84,31 @@ public abstract class TabModelFilter extends EmptyTabModelObserver implements Ta
return Collections.unmodifiableList(relatedTab); 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 * Concrete class requires to define what's the behavior when {@link TabModel} added a
* {@link Tab}. * {@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