Commit 6ebc659c authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Create TabModelFilterFactory and pass an implementation into .tabmodel

ChromeTabModelFilterFactory is the implementation passed in, and
provides either TabGroupModelFilter or EmptyTabModelFilter, depending
on flags and DFM availability.

This breaks the dependency from TabModelFilterProvider and allows it
to be moved to the tabmodel modules.

Bug: 1090033
Change-Id: Ibb19abca6b4224e7c24f23c4e187d20f268bd3fe
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2231743Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarMei Liang <meiliang@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#776505}
parent f1b01452
......@@ -80,6 +80,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/app/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingDelegateFactory.java",
"java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTask.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowBridge.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillExpirationDateFixFlowPrompt.java",
"java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java",
......
include_rules = [
"+chrome/browser/tabmodel",
]
// 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.app.tabmodel;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelFilter;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import javax.inject.Inject;
/**
* Glue code that decides which concrete {@link TabModelFilterFactory} should be used.
*/
@ActivityScope
public class ChromeTabModelFilterFactory implements TabModelFilterFactory {
@Inject
public ChromeTabModelFilterFactory() {}
/**
* Return a {@link TabModelFilter} based on feature flags. This can return either:
* - A filter that implements tab groups.
* - A canonical {@link EmptyTabModelFilter}.
*
* @param model The {@link TabModel} that the {@link TabModelFilter} acts on.
* @return a {@link TabModelFilter}.
*/
@Override
public TabModelFilter createTabModelFilter(TabModel model) {
if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()) {
TabManagementDelegate tabManagementDelegate = TabManagementModuleProvider.getDelegate();
if (tabManagementDelegate != null) {
return tabManagementDelegate.createTabGroupModelFilter(model);
}
}
return new EmptyTabModelFilter(model);
}
}
include_rules = [
"+chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java",
]
\ No newline at end of file
"+chrome/browser/tabmodel",
]
......@@ -13,6 +13,7 @@ import org.chromium.base.Callback;
import org.chromium.base.IntentUtils;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory;
import org.chromium.chrome.browser.customtabs.CustomTabTabPersistencePolicy;
......@@ -23,6 +24,7 @@ import org.chromium.chrome.browser.tab.TabBuilder;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.content_public.browser.WebContents;
......@@ -40,6 +42,7 @@ import dagger.Lazy;
public class CustomTabActivityTabFactory {
private final ChromeActivity<?> mActivity;
private final CustomTabTabPersistencePolicy mPersistencePolicy;
private final TabModelFilterFactory mTabModelFilterFactory;
private final Lazy<ActivityWindowAndroid> mActivityWindowAndroid;
private final Lazy<CustomTabDelegateFactory> mCustomTabDelegateFactory;
private final BrowserServicesIntentDataProvider mIntentDataProvider;
......@@ -53,12 +56,14 @@ public class CustomTabActivityTabFactory {
@Inject
public CustomTabActivityTabFactory(ChromeActivity<?> activity,
CustomTabTabPersistencePolicy persistencePolicy,
ChromeTabModelFilterFactory tabModelFilterFactory,
Lazy<ActivityWindowAndroid> activityWindowAndroid,
Lazy<CustomTabDelegateFactory> customTabDelegateFactory,
BrowserServicesIntentDataProvider intentDataProvider,
@Nullable StartupTabPreloader startupTabPreloader) {
mActivity = activity;
mPersistencePolicy = persistencePolicy;
mTabModelFilterFactory = tabModelFilterFactory;
mActivityWindowAndroid = activityWindowAndroid;
mCustomTabDelegateFactory = customTabDelegateFactory;
mIntentDataProvider = intentDataProvider;
......@@ -67,8 +72,8 @@ public class CustomTabActivityTabFactory {
/** Creates a {@link TabModelSelector} for the custom tab. */
public TabModelSelectorImpl createTabModelSelector() {
mTabModelSelector = new TabModelSelectorImpl(
mActivity, mActivity, mPersistencePolicy, false, false, false);
mTabModelSelector = new TabModelSelectorImpl(mActivity, mActivity, mPersistencePolicy,
mTabModelFilterFactory, false, false, false);
return mTabModelSelector;
}
......
......@@ -4,10 +4,6 @@
package org.chromium.chrome.browser.tabmodel;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
......@@ -22,10 +18,10 @@ public class TabModelFilterProvider extends EmptyTabModelSelectorObserver {
TabModelFilterProvider() {}
TabModelFilterProvider(List<TabModel> tabModels) {
TabModelFilterProvider(TabModelFilterFactory tabModelFilterFactory, List<TabModel> tabModels) {
List<TabModelFilter> filters = new ArrayList<>();
for (int i = 0; i < tabModels.size(); i++) {
filters.add(createTabModelFilter(tabModels.get(i)));
filters.add(tabModelFilterFactory.createTabModelFilter(tabModels.get(i)));
}
mTabModelFilterList = Collections.unmodifiableList(filters);
......@@ -89,21 +85,6 @@ public class TabModelFilterProvider extends EmptyTabModelSelectorObserver {
}
}
/**
* Return a {@link TabModelFilter} based on feature flags.
* @param model The {@link TabModel} that the {@link TabModelFilter} acts on.
* @return a {@link TabModelFilter}.
*/
private TabModelFilter createTabModelFilter(TabModel model) {
if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()) {
TabManagementDelegate tabManagementDelegate = TabManagementModuleProvider.getDelegate();
if (tabManagementDelegate != null) {
return tabManagementDelegate.createTabGroupModelFilter(model);
}
}
return new EmptyTabModelFilter(model);
}
private void markTabStateInitialized() {
for (TabModelFilter filter : mTabModelFilterList) {
filter.markTabStateInitialized();
......
......@@ -32,6 +32,7 @@ public abstract class TabModelSelectorBase implements TabModelSelector {
*/
private TabModelFilterProvider mTabModelFilterProvider = new TabModelFilterProvider();
private final TabModelFilterFactory mTabModelFilterFactory;
private int mActiveModelIndex;
private final ObserverList<TabModelSelectorObserver> mObservers = new ObserverList<>();
private boolean mTabStateInitialized;
......@@ -40,8 +41,10 @@ public abstract class TabModelSelectorBase implements TabModelSelector {
private final TabCreatorManager mTabCreatorManager;
protected TabModelSelectorBase(TabCreatorManager tabCreatorManager, boolean startIncognito) {
protected TabModelSelectorBase(TabCreatorManager tabCreatorManager,
TabModelFilterFactory tabModelFilterFactory, boolean startIncognito) {
mTabCreatorManager = tabCreatorManager;
mTabModelFilterFactory = tabModelFilterFactory;
mStartIncognito = startIncognito;
}
......@@ -53,7 +56,7 @@ public abstract class TabModelSelectorBase implements TabModelSelector {
Collections.addAll(mTabModels, models);
mActiveModelIndex = getModelIndex(mStartIncognito);
assert mActiveModelIndex != MODEL_NOT_FOUND;
mTabModelFilterProvider = new TabModelFilterProvider(mTabModels);
mTabModelFilterProvider = new TabModelFilterProvider(mTabModelFilterFactory, mTabModels);
addObserver(mTabModelFilterProvider);
TabModelObserver tabModelObserver = new TabModelObserver() {
......
......@@ -56,16 +56,16 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
/**
* Builds a {@link TabModelSelectorImpl} instance.
*
* @param activity An {@link Activity} instance.
* @param activity An {@link Activity} instance.
* @param tabCreatorManager A {@link TabCreatorManager} instance.
* @param persistencePolicy A {@link TabPersistencePolicy} instance.
* @param tabModelFilterFactory
* @param supportUndo Whether a tab closure can be undone.
*/
public TabModelSelectorImpl(Activity activity, TabCreatorManager tabCreatorManager,
TabPersistencePolicy persistencePolicy, boolean supportUndo, boolean isTabbedActivity,
boolean startIncognito) {
super(tabCreatorManager, startIncognito);
TabPersistencePolicy persistencePolicy, TabModelFilterFactory tabModelFilterFactory,
boolean supportUndo, boolean isTabbedActivity, boolean startIncognito) {
super(tabCreatorManager, tabModelFilterFactory, startIncognito);
mUma = new TabModelSelectorUma(activity);
final TabPersistentStoreObserver persistentStoreObserver =
new TabPersistentStoreObserver() {
......
......@@ -15,6 +15,7 @@ import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.VerifiesOnN;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tab.Tab;
......@@ -232,8 +233,9 @@ public class TabWindowManager implements ActivityStateListener {
}
TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePolicy(
selectorIndex, mergeTabs);
return new TabModelSelectorImpl(
activity, tabCreatorManager, persistencePolicy, true, true, false);
TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory();
return new TabModelSelectorImpl(activity, tabCreatorManager, persistencePolicy,
tabModelFilterFactory, true, true, false);
}
}
}
......@@ -33,6 +33,7 @@ import org.chromium.base.test.util.AdvancedMockContext;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab;
......@@ -463,8 +464,9 @@ public class CustomTabTabPersistencePolicyTest {
CustomTabActivity activity = new CustomTabActivity();
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
TabModelSelectorImpl selector = new TabModelSelectorImpl(
activity, activity, buildTestPersistencePolicy(), false, false, false);
TabModelSelectorImpl selector =
new TabModelSelectorImpl(activity, activity, buildTestPersistencePolicy(),
new ChromeTabModelFilterFactory(), false, false, false);
selector.initializeForTesting(normalTabModel, incognitoTabModel);
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
return selector;
......
......@@ -22,6 +22,7 @@ import org.chromium.base.test.params.ParameterizedRunner;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
......@@ -77,10 +78,11 @@ public class ContextMenuLoadUrlParamsTest {
return super.openNewTab(loadUrlParams, type, parent, incognito);
}
public RecordingTabModelSelector(
Activity activity, TabCreatorManager tabCreatorManager, int selectorIndex) {
public RecordingTabModelSelector(Activity activity, TabCreatorManager tabCreatorManager,
TabModelFilterFactory tabModelFilterFactory, int selectorIndex) {
super(activity, tabCreatorManager,
new TabbedModeTabPersistencePolicy(selectorIndex, false), false, false, false);
new TabbedModeTabPersistencePolicy(selectorIndex, false), tabModelFilterFactory,
false, false, false);
}
}
......@@ -104,8 +106,8 @@ public class ContextMenuLoadUrlParamsTest {
@Override
public TabModelSelector buildSelector(Activity activity,
TabCreatorManager tabCreatorManager, int selectorIndex) {
return new RecordingTabModelSelector(
activity, tabCreatorManager, selectorIndex);
return new RecordingTabModelSelector(activity, tabCreatorManager,
new ChromeTabModelFilterFactory(), selectorIndex);
}
});
});
......
......@@ -58,7 +58,7 @@ public class TabModelSelectorObserverTestRule extends ChromeBrowserTestRule {
}
private void initialize() {
mSelector = new TabModelSelectorBase(null, false) {
mSelector = new TabModelSelectorBase(null, EmptyTabModelFilter::new, false) {
@Override
public Tab openNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent,
boolean incognito) {
......
......@@ -65,7 +65,7 @@ public class TabModelSelectorTabModelObserverTest {
@UiThreadTest
@SmallTest
public void testUninitializedSelector() throws TimeoutException {
mSelector = new TabModelSelectorBase(null, false) {
mSelector = new TabModelSelectorBase(null, EmptyTabModelFilter::new, false) {
@Override
public Tab openNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent,
boolean incognito) {
......
......@@ -112,7 +112,8 @@ public class TabModelSelectorTabObserverTest {
@Test
@SmallTest
public void testObserverAddedBeforeInitialize() {
TabModelSelectorBase selector = new TabModelSelectorBase(null, false) {
TabModelSelectorBase selector = new TabModelSelectorBase(
null, EmptyTabModelFilter::new, false) {
@Override
public Tab openNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent,
boolean incognito) {
......
......@@ -27,6 +27,7 @@ import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper;
import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
......@@ -86,7 +87,7 @@ public class TabPersistentStoreTest {
private final TabModelOrderController mTabModelOrderController;
public TestTabModelSelector() throws Exception {
super(new MockTabCreatorManager(), false);
super(new MockTabCreatorManager(), new ChromeTabModelFilterFactory(), false);
((MockTabCreatorManager) getTabCreatorManager()).initialize(this);
mTabPersistentStoreObserver = new MockTabPersistentStoreObserver();
mTabPersistentStore =
......
......@@ -37,6 +37,8 @@ public class TabModelSelectorImplTest {
@Mock
TabPersistencePolicy mMockTabPersistencePolicy;
@Mock
TabModelFilterFactory mMockTabModelFilterFactory;
@Mock
TabContentManager mMockTabContentManager;
@Mock
TabDelegateFactory mTabDelegateFactory;
......@@ -56,8 +58,8 @@ public class TabModelSelectorImplTest {
mTabCreatorManager = new MockTabCreatorManager();
mTabModelSelector = new TabModelSelectorImpl(mActivity, mTabCreatorManager,
mMockTabPersistencePolicy,
/*supportUndo=*/false, /*isTabbedActivity=*/false, /*startIncognito=*/false);
mMockTabPersistencePolicy, mMockTabModelFilterFactory,
/*supportUndo=*//*isTabbedActivity=*/false, /*startIncognito=*/false, false);
mTabCreatorManager.initialize(mTabModelSelector);
mTabModelSelector.onNativeLibraryReadyInternal(mMockTabContentManager,
new MockTabModel(false, null), new MockTabModel(true, null));
......
......@@ -11,6 +11,7 @@ android_library("java") {
"android/java/src/org/chromium/chrome/browser/tabmodel/TabList.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilter.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterFactory.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java",
]
......
// 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.tabmodel;
/**
* A factory that creates {@link TabModelFilter} instances for {@link TabModel}s.
*/
public interface TabModelFilterFactory {
/**
* @param model The {@link TabModel} to serve as base for the new filter.
* @return A new {@link TabModelFilter} for {@code model}.
*/
TabModelFilter createTabModelFilter(TabModel model);
}
......@@ -6,6 +6,7 @@ package org.chromium.chrome.test.util.browser.tabmodel;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorBase;
......@@ -23,7 +24,7 @@ public class MockTabModelSelector extends TabModelSelectorBase {
public MockTabModelSelector(
int tabCount, int incognitoTabCount, MockTabModel.MockTabModelDelegate delegate) {
super(null, false);
super(null, EmptyTabModelFilter::new, false);
initialize(new MockTabModel(false, delegate), new MockTabModel(true, delegate));
for (int i = 0; i < tabCount; i++) {
addMockTab();
......
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