| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
|
| deleted file mode 100644
|
| index e0bd083531349ea339810be834bc68051eeb4081..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
|
| +++ /dev/null
|
| @@ -1,442 +0,0 @@
|
| -// Copyright 2015 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.content.Context;
|
| -import android.os.Handler;
|
| -
|
| -import org.chromium.base.metrics.RecordHistogram;
|
| -import org.chromium.chrome.browser.ChromeActivity;
|
| -import org.chromium.chrome.browser.Tab;
|
| -import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
|
| -import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
|
| -import org.chromium.chrome.browser.ntp.NativePageFactory;
|
| -import org.chromium.chrome.browser.tab.TabIdManager;
|
| -import org.chromium.chrome.browser.tabmodel.OffTheRecordTabModel.OffTheRecordTabModelDelegate;
|
| -import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
|
| -import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
|
| -import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver;
|
| -import org.chromium.content_public.browser.LoadUrlParams;
|
| -import org.chromium.ui.base.WindowAndroid;
|
| -
|
| -import java.util.concurrent.atomic.AtomicBoolean;
|
| -
|
| -/**
|
| - * This class manages all the ContentViews in the app. As it manipulates views, it must be
|
| - * instantiated and used in the UI Thread. It acts as a TabModel which delegates all
|
| - * TabModel methods to the active model that it contains.
|
| - */
|
| -public class TabModelSelectorImpl extends TabModelSelectorBase implements TabModelDelegate {
|
| -
|
| - private final ChromeActivity mActivity;
|
| -
|
| - /** Flag set to false when the asynchronous loading of tabs is finished. */
|
| - private final AtomicBoolean mSessionRestoreInProgress =
|
| - new AtomicBoolean(true);
|
| - private final TabPersistentStore mTabSaver;
|
| -
|
| - // This flag signifies the object has gotten an onNativeReady callback and
|
| - // has not been destroyed.
|
| - private boolean mActiveState = false;
|
| -
|
| - private final TabModelOrderController mOrderController;
|
| -
|
| - private OverviewModeBehavior mOverviewModeBehavior;
|
| -
|
| - private TabContentManager mTabContentManager;
|
| -
|
| - private Tab mVisibleTab;
|
| -
|
| - private final TabModelSelectorUma mUma;
|
| -
|
| - private CloseAllTabsDelegate mCloseAllTabsDelegate;
|
| -
|
| - private ChromeTabCreator mRegularTabCreator;
|
| - private ChromeTabCreator mIncognitoTabCreator;
|
| -
|
| - private static class TabModelImplCreator implements OffTheRecordTabModelDelegate {
|
| - private final ChromeActivity mActivity;
|
| - private final TabModelSelectorUma mUma;
|
| - private final TabModelOrderController mOrderController;
|
| - private final TabContentManager mTabContentManager;
|
| - private final TabPersistentStore mTabSaver;
|
| - private final TabModelDelegate mModelDelegate;
|
| -
|
| - /**
|
| - * Constructor for an Incognito TabModelImpl.
|
| - *
|
| - * @param activity The activity owning this TabModel.
|
| - * @param uma Handles UMA tracking for the model.
|
| - * @param orderController Determines the order for inserting new Tabs.
|
| - * @param tabContentManager Manages the display content of the tab.
|
| - * @param tabSaver Handler for saving tabs.
|
| - * @param modelDelegate Delegate to handle external dependencies and interactions.
|
| - */
|
| - public TabModelImplCreator(ChromeActivity activity, TabModelSelectorUma uma,
|
| - TabModelOrderController orderController, TabContentManager tabContentManager,
|
| - TabPersistentStore tabSaver, TabModelDelegate modelDelegate) {
|
| - mActivity = activity;
|
| - mUma = uma;
|
| - mOrderController = orderController;
|
| - mTabContentManager = tabContentManager;
|
| - mTabSaver = tabSaver;
|
| - mModelDelegate = modelDelegate;
|
| - }
|
| -
|
| - @Override
|
| - public TabModel createTabModel() {
|
| - return new TabModelImpl(true, mActivity, mUma, mOrderController,
|
| - mTabContentManager, mTabSaver, mModelDelegate);
|
| - }
|
| -
|
| - @Override
|
| - public boolean doOffTheRecordTabsExist() {
|
| - return TabWindowManager.getInstance().getIncognitoTabCount() > 0;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Builds a {@link TabModelSelectorImpl} instance.
|
| - * @param activity The {@link ChromeActivity} this model selector lives in.
|
| - * @param selectorIndex The index this selector represents in the list of selectors.
|
| - * @param windowAndroid The {@link WindowAndroid} associated with this model selector.
|
| - */
|
| - public TabModelSelectorImpl(ChromeActivity activity, int selectorIndex,
|
| - WindowAndroid windowAndroid) {
|
| - super();
|
| - mActivity = activity;
|
| - mUma = new TabModelSelectorUma(mActivity);
|
| - final TabPersistentStoreObserver persistentStoreObserver =
|
| - new TabPersistentStoreObserver() {
|
| - @Override
|
| - public void onStateLoaded(Context context) {
|
| - markTabStateInitialized();
|
| - }
|
| -
|
| - @Override
|
| - public void onDetailsRead(int index, int id, String url, boolean isStandardActiveIndex,
|
| - boolean isIncognitoActiveIndex) {
|
| - }
|
| -
|
| - @Override
|
| - public void onInitialized(int tabCountAtStartup) {
|
| - RecordHistogram.recordCountHistogram("Tabs.CountAtStartup", tabCountAtStartup);
|
| - }
|
| - };
|
| - mTabSaver = new TabPersistentStore(this, selectorIndex, mActivity, mActivity,
|
| - persistentStoreObserver);
|
| - mOrderController = new TabModelOrderController(this);
|
| - mRegularTabCreator = new ChromeTabCreator(
|
| - mActivity, windowAndroid, mOrderController, mTabSaver, false);
|
| - mIncognitoTabCreator = new ChromeTabCreator(
|
| - mActivity, windowAndroid, mOrderController, mTabSaver, true);
|
| - mActivity.setTabCreators(mRegularTabCreator, mIncognitoTabCreator);
|
| - }
|
| -
|
| - @Override
|
| - protected void markTabStateInitialized() {
|
| - super.markTabStateInitialized();
|
| - if (!mSessionRestoreInProgress.getAndSet(false)) return;
|
| -
|
| - // This is the first time we set
|
| - // |mSessionRestoreInProgress|, so we need to broadcast.
|
| - TabModelImpl model = (TabModelImpl) getModel(false);
|
| -
|
| - if (model != null) {
|
| - model.broadcastSessionRestoreComplete();
|
| - } else {
|
| - assert false : "Normal tab model is null after tab state loaded.";
|
| - }
|
| - }
|
| -
|
| - private void handleOnPageLoadStopped(Tab tab) {
|
| - if (tab != null) mTabSaver.addTabToSaveQueue(tab);
|
| - }
|
| -
|
| - /**
|
| - *
|
| - * @param overviewModeBehavior The {@link OverviewModeBehavior} that should be used to determine
|
| - * when the app is in overview mode or not.
|
| - */
|
| - public void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
|
| - assert overviewModeBehavior != null;
|
| - mOverviewModeBehavior = overviewModeBehavior;
|
| - }
|
| -
|
| - /**
|
| - * Should be called when the app starts showing a view with multiple tabs.
|
| - */
|
| - public void onTabsViewShown() {
|
| - mUma.onTabsViewShown();
|
| - }
|
| -
|
| - /**
|
| - * Should be called once the native library is loaded so that the actual internals of this
|
| - * class can be initialized.
|
| - * @param tabContentProvider A {@link TabContentManager} instance.
|
| - */
|
| - public void onNativeLibraryReady(TabContentManager tabContentProvider) {
|
| - assert !mActiveState : "onNativeLibraryReady called twice!";
|
| - mTabContentManager = tabContentProvider;
|
| -
|
| - TabModel normalModel = new TabModelImpl(false, mActivity, mUma, mOrderController,
|
| - mTabContentManager, mTabSaver, this);
|
| - TabModel incognitoModel = new OffTheRecordTabModel(new TabModelImplCreator(
|
| - mActivity, mUma, mOrderController, mTabContentManager, mTabSaver, this));
|
| - initialize(isIncognitoSelected(), normalModel, incognitoModel);
|
| - mRegularTabCreator.setTabModel(normalModel, mTabContentManager);
|
| - mIncognitoTabCreator.setTabModel(incognitoModel, mTabContentManager);
|
| -
|
| - mTabSaver.setTabContentManager(tabContentProvider);
|
| -
|
| - addObserver(new EmptyTabModelSelectorObserver() {
|
| - @Override
|
| - public void onNewTabCreated(Tab tab) {
|
| - // Only invalidate if the tab exists in the currently selected model.
|
| - if (TabModelUtils.getTabById(getCurrentModel(), tab.getId()) != null) {
|
| - mTabContentManager.invalidateIfChanged(tab.getId(), tab.getUrl());
|
| - }
|
| - }
|
| - });
|
| -
|
| - mActiveState = true;
|
| -
|
| - new TabModelSelectorTabObserver(this) {
|
| - @Override
|
| - public void onUrlUpdated(Tab tab) {
|
| - TabModel model = getModelForTabId(tab.getId());
|
| - if (model == getCurrentModel()) {
|
| - mTabContentManager.invalidateIfChanged(tab.getId(), tab.getUrl());
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onLoadStopped(Tab tab) {
|
| - handleOnPageLoadStopped(tab);
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadStarted(Tab tab, String url) {
|
| - String previousUrl = tab.getUrl();
|
| - if (NativePageFactory.isNativePageUrl(previousUrl, tab.isIncognito())) {
|
| - mTabContentManager.invalidateTabThumbnail(tab.getId(), previousUrl);
|
| - } else {
|
| - mTabContentManager.removeTabThumbnail(tab.getId());
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadFinished(Tab tab) {
|
| - mUma.onPageLoadFinished(tab.getId());
|
| - }
|
| -
|
| - @Override
|
| - public void onPageLoadFailed(Tab tab, int errorCode) {
|
| - mUma.onPageLoadFailed(tab.getId());
|
| - }
|
| -
|
| - @Override
|
| - public void onCrash(Tab tab, boolean sadTabShown) {
|
| - if (sadTabShown) {
|
| - mTabContentManager.removeTabThumbnail(tab.getId());
|
| - }
|
| - mUma.onTabCrashed(tab.getId());
|
| - }
|
| - };
|
| - }
|
| -
|
| - @Override
|
| - public void setCloseAllTabsDelegate(CloseAllTabsDelegate delegate) {
|
| - mCloseAllTabsDelegate = delegate;
|
| - }
|
| -
|
| - @Override
|
| - public TabModel getModelAt(int index) {
|
| - return mActiveState ? super.getModelAt(index) : EmptyTabModel.getInstance();
|
| - }
|
| -
|
| - @Override
|
| - public void selectModel(boolean incognito) {
|
| - TabModel oldModel = getCurrentModel();
|
| - super.selectModel(incognito);
|
| - TabModel newModel = getCurrentModel();
|
| - if (oldModel != newModel) {
|
| - TabModelUtils.setIndex(newModel, newModel.index());
|
| -
|
| - // Make the call to notifyDataSetChanged() after any delayed events
|
| - // have had a chance to fire. Otherwise, this may result in some
|
| - // drawing to occur before animations have a chance to work.
|
| - new Handler().post(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - notifyChanged();
|
| - }
|
| - });
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Commits all pending tab closures for all {@link TabModel}s in this {@link TabModelSelector}.
|
| - */
|
| - @Override
|
| - public void commitAllTabClosures() {
|
| - for (int i = 0; i < getModels().size(); i++) {
|
| - getModelAt(i).commitAllTabClosures();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public boolean closeAllTabsRequest(boolean incognito) {
|
| - return mCloseAllTabsDelegate.closeAllTabsRequest(incognito);
|
| - }
|
| -
|
| - public void saveState() {
|
| - commitAllTabClosures();
|
| - mTabSaver.saveState();
|
| - }
|
| -
|
| - /**
|
| - * Load the saved tab state. This should be called before any new tabs are created. The saved
|
| - * tabs shall not be restored until {@link #restoreTabs} is called.
|
| - */
|
| - public void loadState() {
|
| - int nextId = mTabSaver.loadState();
|
| - if (nextId >= 0) TabIdManager.getInstance().incrementIdCounterTo(nextId);
|
| - }
|
| -
|
| - /**
|
| - * Restore the saved tabs which were loaded by {@link #loadState}.
|
| - *
|
| - * @param setActiveTab If true, synchronously load saved active tab and set it as the current
|
| - * active tab.
|
| - */
|
| - public void restoreTabs(boolean setActiveTab) {
|
| - mTabSaver.restoreTabs(setActiveTab);
|
| - }
|
| -
|
| - /**
|
| - * If there is an asynchronous session restore in-progress, try to synchronously restore
|
| - * the state of a tab with the given url as a frozen tab. This method has no effect if
|
| - * there isn't a tab being restored with this url, or the tab has already been restored.
|
| - *
|
| - * @return true if there exists a tab with the url.
|
| - */
|
| - public boolean tryToRestoreTabStateForUrl(String url) {
|
| - if (!isSessionRestoreInProgress()) return false;
|
| - return mTabSaver.restoreTabStateForUrl(url);
|
| - }
|
| -
|
| - /**
|
| - * If there is an asynchronous session restore in-progress, try to synchronously restore
|
| - * the state of a tab with the given id as a frozen tab. This method has no effect if
|
| - * there isn't a tab being restored with this id, or the tab has already been restored.
|
| - *
|
| - * @return true if there exists a tab with the id.
|
| - */
|
| - public boolean tryToRestoreTabStateForId(int id) {
|
| - if (!isSessionRestoreInProgress()) return false;
|
| - return mTabSaver.restoreTabStateForId(id);
|
| - }
|
| -
|
| - public void clearState() {
|
| - mTabSaver.clearState();
|
| - }
|
| -
|
| - public void clearEncryptedState() {
|
| - mTabSaver.clearEncryptedState();
|
| - }
|
| -
|
| - @Override
|
| - public void destroy() {
|
| - mTabSaver.destroy();
|
| - mUma.destroy();
|
| - super.destroy();
|
| - mActiveState = false;
|
| - }
|
| -
|
| - @Override
|
| - public Tab openNewTab(LoadUrlParams loadUrlParams, TabLaunchType type, Tab parent,
|
| - boolean incognito) {
|
| - return mActivity.getTabCreator(incognito).createNewTab(loadUrlParams, type, parent);
|
| - }
|
| -
|
| - /**
|
| - * @return Number of restored tabs on cold startup.
|
| - */
|
| - public int getRestoredTabCount() {
|
| - return mTabSaver.getRestoredTabCount();
|
| - }
|
| -
|
| - @Override
|
| - public void requestToShowTab(Tab tab, TabSelectionType type) {
|
| - boolean isFromExternalApp = tab != null
|
| - && tab.getLaunchType() == TabLaunchType.FROM_EXTERNAL_APP;
|
| -
|
| - if (mVisibleTab != tab && tab != null && !tab.isNativePage()) {
|
| - TabModelBase.startTabSwitchLatencyTiming(type);
|
| - }
|
| - if (mVisibleTab != null && mVisibleTab != tab && !mVisibleTab.needsReload()) {
|
| - if (mVisibleTab.isInitialized()) {
|
| - // TODO(dtrainor): Once we figure out why we can't grab a snapshot from the current
|
| - // tab when we have other tabs loading from external apps remove the checks for
|
| - // FROM_EXTERNAL_APP/FROM_NEW.
|
| - if (!mVisibleTab.isClosing()
|
| - && (!isFromExternalApp || type != TabSelectionType.FROM_NEW)) {
|
| - cacheTabBitmap(mVisibleTab);
|
| - }
|
| - mVisibleTab.hide();
|
| - mVisibleTab.setFullscreenManager(null);
|
| - mTabSaver.addTabToSaveQueue(mVisibleTab);
|
| - }
|
| - mVisibleTab = null;
|
| - }
|
| -
|
| - if (tab == null) {
|
| - notifyChanged();
|
| - return;
|
| - }
|
| -
|
| - // We hit this case when the user enters tab switcher and comes back to the current tab
|
| - // without actual tab switch.
|
| - if (mVisibleTab == tab && !mVisibleTab.isHidden()) {
|
| - // The current tab might have been killed by the os while in tab switcher.
|
| - tab.loadIfNeeded();
|
| - return;
|
| - }
|
| -
|
| - tab.setFullscreenManager(mActivity.getFullscreenManager());
|
| - mVisibleTab = tab;
|
| -
|
| - // Don't execute the tab display part if Chrome has just been sent to background. This
|
| - // avoids uneccessary work (tab restore) and prevents pollution of tab display metrics - see
|
| - // http://crbug.com/316166.
|
| - if (type != TabSelectionType.FROM_EXIT) {
|
| - tab.show(type);
|
| - mUma.onShowTab(tab.getId(), tab.isBeingRestored());
|
| - }
|
| - }
|
| -
|
| - private void cacheTabBitmap(Tab tabToCache) {
|
| - // Trigger a capture of this tab.
|
| - if (tabToCache == null) return;
|
| - mTabContentManager.cacheTabThumbnail(tabToCache);
|
| - }
|
| -
|
| - @Override
|
| - public boolean isInOverviewMode() {
|
| - return mOverviewModeBehavior != null && mOverviewModeBehavior.overviewVisible();
|
| - }
|
| -
|
| - @Override
|
| - public boolean isSessionRestoreInProgress() {
|
| - return mSessionRestoreInProgress.get();
|
| - }
|
| -
|
| - // TODO(tedchoc): Remove the need for this to be exposed.
|
| - @Override
|
| - public void notifyChanged() {
|
| - super.notifyChanged();
|
| - }
|
| -}
|
|
|