Commit 1d749be3 authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Split TabWindowManagerSingleton out of TabWindowManager.

TabWindowManagerSingleton will be left in the glue layer, but in the
modules the dependency should be explicitly passed.

Bug: 1112922
Change-Id: I725277f04c039f2fed42836d4d7a4079665b0ccc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2446839
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815194}
parent 14e6023b
......@@ -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/ChromeNextTabPolicySupplier.java",
"java/src/org/chromium/chrome/browser/app/tabmodel/ChromeTabModelFilterFactory.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/VideoPlayerActivity.java",
"java/src/org/chromium/chrome/browser/app/video_tutorials/VideoTutorialListActivity.java",
......
......@@ -55,6 +55,7 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.ChromeNextTabPolicySupplier;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
......@@ -136,7 +137,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.browser.tabmodel.TabWindowManager;
import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
import org.chromium.chrome.browser.tasks.EngagementTimeUtil;
import org.chromium.chrome.browser.tasks.JourneyManager;
......@@ -1544,7 +1544,7 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
mNextTabPolicySupplier = new ChromeNextTabPolicySupplier(mOverviewModeBehaviorSupplier);
mTabModelSelectorImpl =
(TabModelSelectorImpl) TabWindowManager.getInstance().requestSelector(
(TabModelSelectorImpl) TabWindowManagerSingleton.getInstance().requestSelector(
this, this, mNextTabPolicySupplier, index);
if (mTabModelSelectorImpl == null) {
Toast.makeText(
......@@ -2051,7 +2051,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
super.onSaveInstanceState(outState);
CipherFactory.getInstance().saveToBundle(outState);
outState.putBoolean("is_incognito_selected", getCurrentTabModel().isIncognito());
outState.putInt(WINDOW_INDEX, TabWindowManager.getInstance().getIndexForWindow(this));
outState.putInt(
WINDOW_INDEX, TabWindowManagerSingleton.getInstance().getIndexForWindow(this));
}
@Override
......
// 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.base.ThreadUtils;
import org.chromium.chrome.browser.tabmodel.TabWindowManager;
/**
* Glue-level singleton instance of {@link TabWindowManager}.
*/
public class TabWindowManagerSingleton {
private static TabWindowManager sInstance;
/**
* @return The singleton instance of {@link TabWindowManager}.
*/
public static TabWindowManager getInstance() {
ThreadUtils.assertOnUiThread();
if (sInstance == null) {
sInstance = new TabWindowManager(AsyncTabParamsManagerSingleton.getInstance());
}
return sInstance;
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ import androidx.annotation.Nullable;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory;
......@@ -21,7 +22,6 @@ import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitio
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabWindowManager;
import org.chromium.components.browser_ui.notifications.NotificationManagerProxy;
import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl;
import org.chromium.components.browser_ui.notifications.NotificationMetadata;
......@@ -102,7 +102,7 @@ public class MediaCaptureNotificationServiceImpl extends MediaCaptureNotificatio
} else if (ACTION_SCREEN_CAPTURE_STOP.equals(action)) {
// Notify native to stop screen capture when the STOP button in notification
// is clicked.
final Tab tab = TabWindowManager.getInstance().getTabById(notificationId);
final Tab tab = TabWindowManagerSingleton.getInstance().getTabById(notificationId);
if (tab != null) {
MediaCaptureDevicesDispatcherAndroid.notifyStopped(tab.getWebContents());
}
......@@ -285,9 +285,9 @@ public class MediaCaptureNotificationServiceImpl extends MediaCaptureNotificatio
intent.putExtra(NOTIFICATION_ID_EXTRA, tabId);
intent.putExtra(NOTIFICATION_MEDIA_URL_EXTRA, url.getSpec());
intent.putExtra(NOTIFICATION_MEDIA_TYPE_EXTRA, mediaType);
if (TabWindowManager.getInstance().getTabById(tabId) != null) {
if (TabWindowManagerSingleton.getInstance().getTabById(tabId) != null) {
intent.putExtra(NOTIFICATION_MEDIA_IS_INCOGNITO,
TabWindowManager.getInstance().getTabById(tabId).isIncognito());
TabWindowManagerSingleton.getInstance().getTabById(tabId).isIncognito());
}
context.startService(intent);
}
......
......@@ -30,6 +30,7 @@ import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
......@@ -546,7 +547,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
@Override
public void onSwitchToTab(OmniboxSuggestion suggestion, int position) {
Tab tab = mAutocomplete.findMatchingTabWithUrl(suggestion.getUrl());
TabWindowManager tabWindowManager = TabWindowManager.getInstance();
TabWindowManager tabWindowManager = TabWindowManagerSingleton.getInstance();
if (tab == null || tabWindowManager == null) {
onSuggestionClicked(suggestion, position, suggestion.getUrl());
return;
......
......@@ -13,10 +13,10 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.ActivityState;
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.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;
......@@ -57,9 +57,6 @@ public class TabWindowManager implements ActivityStateListener {
NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex);
}
/** The singleton reference. */
private static TabWindowManager sInstance;
private final AsyncTabParamsManager mAsyncTabParamsManager;
private TabModelSelectorFactory mSelectorFactory = new DefaultTabModelSelectorFactory();
......@@ -68,17 +65,6 @@ public class TabWindowManager implements ActivityStateListener {
private Map<Activity, TabModelSelector> mAssignments = new HashMap<>();
/**
* @return The singleton instance of {@link TabWindowManager}.
*/
public static TabWindowManager getInstance() {
ThreadUtils.assertOnUiThread();
if (sInstance == null) {
sInstance = new TabWindowManager(AsyncTabParamsManagerSingleton.getInstance());
}
return sInstance;
}
/**
* Called to request a {@link TabModelSelector} based on {@code index}. Note that the
* {@link TabModelSelector} returned might not actually be the one related to {@code index} and
......@@ -228,7 +214,7 @@ public class TabWindowManager implements ActivityStateListener {
mSelectorFactory = factory;
}
private TabWindowManager(AsyncTabParamsManager asyncTabParamsManager) {
public TabWindowManager(AsyncTabParamsManager asyncTabParamsManager) {
mAsyncTabParamsManager = asyncTabParamsManager;
ApplicationStatus.registerStateListenerForAllActivities(this);
......@@ -252,9 +238,14 @@ public class TabWindowManager implements ActivityStateListener {
if (MultiInstanceManager.shouldMergeOnStartup(activity)) {
mergeTabs = mergeTabs
&& (!MultiWindowUtils.getInstance().isInMultiDisplayMode(activity)
|| getInstance().getNumberOfAssignedTabModelSelectors() == 0);
|| TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0);
} else {
mergeTabs = mergeTabs && getInstance().getNumberOfAssignedTabModelSelectors() == 0;
mergeTabs = mergeTabs
&& TabWindowManagerSingleton.getInstance()
.getNumberOfAssignedTabModelSelectors()
== 0;
}
if (mergeTabs) {
MultiInstanceManager.mergedOnStartup();
......
......@@ -20,6 +20,7 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.AsyncTask;
import org.chromium.base.task.BackgroundOnlyAsyncTask;
import org.chromium.base.task.TaskRunner;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
......@@ -362,7 +363,7 @@ public class TabbedModeTabPersistencePolicy implements TabPersistencePolicy {
@Override
protected void onPostExecute(Void unused) {
if (mDestroyed) return;
TabWindowManager tabWindowManager = TabWindowManager.getInstance();
TabWindowManager tabWindowManager = TabWindowManagerSingleton.getInstance();
if (mTabFileNames != null) {
List<String> filesToDelete = new ArrayList<>();
......
......@@ -28,10 +28,10 @@ import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.ChromeTabbedActivity2;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabWindowManager;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.MenuUtils;
......@@ -88,7 +88,8 @@ public class MultiWindowIntegrationTest {
});
TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertEquals(1, TabWindowManager.getInstance().getIncognitoTabCount());
Assert.assertEquals(
1, TabWindowManagerSingleton.getInstance().getIncognitoTabCount());
// Ensure the same tab exists in the new activity.
Assert.assertEquals(incognitoTabId, cta2.getActivityTab().getId());
......
......@@ -21,6 +21,7 @@ import org.chromium.base.test.util.Feature;
import org.chromium.chrome.R;
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.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.tab.Tab;
......@@ -81,7 +82,7 @@ public class ContextMenuLoadUrlParamsTest {
// be set before super.setUp(), as super.setUp() creates Main and consequently the
// TabModelSelector.
TestThreadUtils.runOnUiThreadBlocking(() -> {
TabWindowManager.getInstance().setTabModelSelectorFactory(
TabWindowManagerSingleton.getInstance().setTabModelSelectorFactory(
new TabModelSelectorFactory() {
@Override
public TabModelSelector buildSelector(Activity activity,
......
......@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout
import org.chromium.chrome.browser.app.ChromeActivity;
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.compositor.overlays.strip.StripLayoutHelper;
import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
......@@ -265,7 +266,7 @@ public class TabPersistentStoreTest {
@After
public void tearDown() {
TestThreadUtils.runOnUiThreadBlocking(() -> {
TabWindowManager.getInstance().onActivityStateChange(
TabWindowManagerSingleton.getInstance().onActivityStateChange(
mChromeActivity, ActivityState.DESTROYED);
});
mMockDirectory.tearDown();
......@@ -696,7 +697,7 @@ public class TabPersistentStoreTest {
TestThreadUtils.runOnUiThreadBlocking(new Callable<TestTabModelSelector>() {
@Override
public TestTabModelSelector call() {
TabWindowManager tabWindowManager = TabWindowManager.getInstance();
TabWindowManager tabWindowManager = TabWindowManagerSingleton.getInstance();
tabWindowManager.setTabModelSelectorFactory(mMockTabModelSelectorFactory);
// Clear any existing TestTabModelSelector (required when
// createAndRestoreRealTabModelImpls is called multiple times in one test).
......
......@@ -19,6 +19,7 @@ import org.chromium.base.test.UiThreadTest;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab;
......@@ -61,7 +62,7 @@ public class TabWindowManagerTest {
}
private MockTabModelSelector requestSelector(ChromeActivity activity, int requestedIndex) {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
manager.setTabModelSelectorFactory(mMockTabModelSelectorFactory);
return (MockTabModelSelector) manager.requestSelector(
activity, activity, () -> NextTabPolicy.HIERARCHICAL, requestedIndex);
......@@ -85,7 +86,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void testSingleActivity() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
TabModelSelector selector0 = requestSelector(activity0, 0);
......@@ -103,7 +104,7 @@ public class TabWindowManagerTest {
@UiThreadTest
public void testMultipleActivities() {
Assert.assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2);
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -146,7 +147,7 @@ public class TabWindowManagerTest {
public void testIndexFallback() {
Assert.assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2);
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -171,7 +172,7 @@ public class TabWindowManagerTest {
public void testIndexFallback2() {
Assert.assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 3);
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -193,7 +194,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void testActivityDeathRemovesSingle() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
TabModelSelector selector0 = requestSelector(activity0, 0);
......@@ -216,7 +217,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void testActivityDeathLetsModelReassign() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
TabModelSelector selector0 = requestSelector(activity0, 0);
......@@ -248,7 +249,7 @@ public class TabWindowManagerTest {
public void testActivityDeathWithMultipleActivities() {
Assert.assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2);
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -281,7 +282,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void testTabExistsInAnySelector() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -317,7 +318,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void testGetTabById() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......@@ -353,7 +354,7 @@ public class TabWindowManagerTest {
@Feature({"Multiwindow"})
@UiThreadTest
public void getTabModelForTab() {
final TabWindowManager manager = TabWindowManager.getInstance();
final TabWindowManager manager = TabWindowManagerSingleton.getInstance();
ChromeActivity activity0 = buildActivity();
ChromeActivity activity1 = buildActivity();
......
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