Commit 2fa5ea5c authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Outer-class DefaultTabModelSelectorFactory, TabModelSelectoryFactory

DefaultTabModelSelectorFactory remains in glue code, binds together
features to create a TabModelSelectorImpl.

TabModelSelectoryFactory is an interface that is moved into the
c/b/tabmodel module.

Bug: 1112922
Change-Id: I03e52fd438da7f7f89a7be012115d053a121c4ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2446352
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815280}
parent f060c46d
...@@ -85,6 +85,7 @@ chrome_java_sources = [ ...@@ -85,6 +85,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton.java", "java/src/org/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier.java", "java/src/org/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.java", "java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java", "java/src/org/chromium/chrome/browser/app/tabmodel/TabWindowManagerSingleton.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java", "java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.java", "java/src/org/chromium/chrome/browser/app/video_tutorials/VideoPlayerActivity.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.app.tabmodel;
import android.app.Activity;
import android.os.Build;
import org.chromium.base.annotations.VerifiesOnN;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelFilterFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorFactory;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
/**
* Default {@link TabModelSelectorFactory} for Chrome.
*/
public class DefaultTabModelSelectorFactory implements TabModelSelectorFactory {
// Do not inline since this uses some APIs only available on Android N versions, which cause
// verification errors.
@VerifiesOnN
@Override
public TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager,
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex) {
// Merge tabs if this TabModelSelector is for a ChromeTabbedActivity created in
// fullscreen mode and there are no TabModelSelector's currently alive. This indicates
// that it is a cold start or process restart in fullscreen mode.
boolean mergeTabs = Build.VERSION.SDK_INT > Build.VERSION_CODES.M
&& MultiInstanceManager.isTabModelMergingEnabled()
&& !activity.isInMultiWindowMode();
if (MultiInstanceManager.shouldMergeOnStartup(activity)) {
mergeTabs = mergeTabs
&& (!MultiWindowUtils.getInstance().isInMultiDisplayMode(activity)
|| TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0);
} else {
mergeTabs = mergeTabs
&& TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0;
}
if (mergeTabs) {
MultiInstanceManager.mergedOnStartup();
}
TabPersistencePolicy persistencePolicy =
new TabbedModeTabPersistencePolicy(selectorIndex, mergeTabs);
TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory();
return new TabModelSelectorImpl(activity, /*windowAndroidSupplier=*/null, tabCreatorManager,
persistencePolicy, tabModelFilterFactory, nextTabPolicySupplier,
AsyncTabParamsManagerSingleton.getInstance(), true, true, false);
}
}
...@@ -19,7 +19,8 @@ public class TabWindowManagerSingleton { ...@@ -19,7 +19,8 @@ public class TabWindowManagerSingleton {
public static TabWindowManager getInstance() { public static TabWindowManager getInstance() {
ThreadUtils.assertOnUiThread(); ThreadUtils.assertOnUiThread();
if (sInstance == null) { if (sInstance == null) {
sInstance = new TabWindowManager(AsyncTabParamsManagerSingleton.getInstance()); sInstance = new TabWindowManager(new DefaultTabModelSelectorFactory(),
AsyncTabParamsManagerSingleton.getInstance());
} }
return sInstance; return sInstance;
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package org.chromium.chrome.browser.tabmodel; package org.chromium.chrome.browser.tabmodel;
import android.app.Activity; import android.app.Activity;
import android.os.Build;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
...@@ -13,12 +12,6 @@ import androidx.annotation.VisibleForTesting; ...@@ -13,12 +12,6 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.ActivityState; import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus; import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener; import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.annotations.VerifiesOnN;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeTabModelFilterFactory;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
...@@ -40,27 +33,9 @@ public class TabWindowManager implements ActivityStateListener { ...@@ -40,27 +33,9 @@ public class TabWindowManager implements ActivityStateListener {
/** The maximum number of simultaneous TabModelSelector instances in this Application. */ /** The maximum number of simultaneous TabModelSelector instances in this Application. */
public static final int MAX_SIMULTANEOUS_SELECTORS = 3; public static final int MAX_SIMULTANEOUS_SELECTORS = 3;
/** private TabModelSelectorFactory mSelectorFactory;
* A factory interface for building a {@link TabModelSelector} instance.
*/
public interface TabModelSelectorFactory {
/**
* Builds a {@link TabModelSelector}.
*
* @param activity An {@link Activity} instance.
* @param tabCreatorManager A {@link TabCreatorManager} instance.
* @param nextTabPolicySupplier A {@link NextTabPolicySupplier} instance.
* @param selectorIndex The index of the {@link TabModelSelector}.
* @return A new {@link TabModelSelector} instance.
*/
TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager,
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex);
}
private final AsyncTabParamsManager mAsyncTabParamsManager; private final AsyncTabParamsManager mAsyncTabParamsManager;
private TabModelSelectorFactory mSelectorFactory = new DefaultTabModelSelectorFactory();
private List<TabModelSelector> mSelectors = new ArrayList<>(); private List<TabModelSelector> mSelectors = new ArrayList<>();
private Map<Activity, TabModelSelector> mAssignments = new HashMap<>(); private Map<Activity, TabModelSelector> mAssignments = new HashMap<>();
...@@ -214,49 +189,12 @@ public class TabWindowManager implements ActivityStateListener { ...@@ -214,49 +189,12 @@ public class TabWindowManager implements ActivityStateListener {
mSelectorFactory = factory; mSelectorFactory = factory;
} }
public TabWindowManager(AsyncTabParamsManager asyncTabParamsManager) { public TabWindowManager(
TabModelSelectorFactory selectorFactory, AsyncTabParamsManager asyncTabParamsManager) {
mSelectorFactory = selectorFactory;
mAsyncTabParamsManager = asyncTabParamsManager; mAsyncTabParamsManager = asyncTabParamsManager;
ApplicationStatus.registerStateListenerForAllActivities(this); ApplicationStatus.registerStateListenerForAllActivities(this);
for (int i = 0; i < MAX_SIMULTANEOUS_SELECTORS; i++) mSelectors.add(null); for (int i = 0; i < MAX_SIMULTANEOUS_SELECTORS; i++) mSelectors.add(null);
} }
private static class DefaultTabModelSelectorFactory implements TabModelSelectorFactory {
// Do not inline since this uses some APIs only available on Android N versions, which cause
// verification errors.
@VerifiesOnN
@Override
public TabModelSelector buildSelector(Activity activity,
TabCreatorManager tabCreatorManager, NextTabPolicySupplier nextTabPolicySupplier,
int selectorIndex) {
// Merge tabs if this TabModelSelector is for a ChromeTabbedActivity created in
// fullscreen mode and there are no TabModelSelector's currently alive. This indicates
// that it is a cold start or process restart in fullscreen mode.
boolean mergeTabs = Build.VERSION.SDK_INT > Build.VERSION_CODES.M
&& MultiInstanceManager.isTabModelMergingEnabled()
&& !activity.isInMultiWindowMode();
if (MultiInstanceManager.shouldMergeOnStartup(activity)) {
mergeTabs = mergeTabs
&& (!MultiWindowUtils.getInstance().isInMultiDisplayMode(activity)
|| TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0);
} else {
mergeTabs = mergeTabs
&& TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0;
}
if (mergeTabs) {
MultiInstanceManager.mergedOnStartup();
}
TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePolicy(
selectorIndex, mergeTabs);
TabModelFilterFactory tabModelFilterFactory = new ChromeTabModelFilterFactory();
return new TabModelSelectorImpl(activity, /*windowAndroidSupplier=*/null,
tabCreatorManager, persistencePolicy, tabModelFilterFactory,
nextTabPolicySupplier, AsyncTabParamsManagerSingleton.getInstance(), true, true,
false);
}
}
} }
...@@ -27,7 +27,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; ...@@ -27,7 +27,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.browser.contextmenu.RevampedContextMenuUtils; import org.chromium.chrome.test.util.browser.contextmenu.RevampedContextMenuUtils;
......
...@@ -201,8 +201,8 @@ public class TabPersistentStoreTest { ...@@ -201,8 +201,8 @@ public class TabPersistentStoreTest {
} }
} }
private final TabWindowManager.TabModelSelectorFactory mMockTabModelSelectorFactory = private final TabModelSelectorFactory mMockTabModelSelectorFactory =
new TabWindowManager.TabModelSelectorFactory() { new TabModelSelectorFactory() {
@Override @Override
public TabModelSelector buildSelector(Activity activity, public TabModelSelector buildSelector(Activity activity,
TabCreatorManager tabCreatorManager, TabCreatorManager tabCreatorManager,
......
...@@ -24,7 +24,6 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivity; ...@@ -24,7 +24,6 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.tab.MockTab; import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier; import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
......
...@@ -29,6 +29,7 @@ android_library("java") { ...@@ -29,6 +29,7 @@ android_library("java") {
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelObserver.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorFactory.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabModelObserver.java",
"android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java", "android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.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;
import android.app.Activity;
import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
/**
* A factory interface for building a {@link TabModelSelector} instance.
*/
public interface TabModelSelectorFactory {
/**
* Builds a {@link TabModelSelector}.
*
* @param activity An {@link Activity} instance.
* @param tabCreatorManager A {@link TabCreatorManager} instance.
* @param nextTabPolicySupplier A {@link NextTabPolicySupplier} instance.
* @param selectorIndex The index of the {@link TabModelSelector}.
* @return A new {@link TabModelSelector} instance.
*/
TabModelSelector buildSelector(Activity activity, TabCreatorManager tabCreatorManager,
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex);
}
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