| Index: chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6a6974ec64845b0bc9f021f0a55035927945ad46
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
|
| @@ -0,0 +1,171 @@
|
| +// Copyright 2014 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 org.chromium.chrome.browser.Tab;
|
| +
|
| +import java.util.ArrayList;
|
| +import java.util.Collections;
|
| +import java.util.List;
|
| +
|
| +/**
|
| + * Implement methods shared across the different model implementations.
|
| + */
|
| +public abstract class TabModelSelectorBase implements TabModelSelector {
|
| + public static final int NORMAL_TAB_MODEL_INDEX = 0;
|
| + public static final int INCOGNITO_TAB_MODEL_INDEX = 1;
|
| +
|
| + private List<TabModel> mTabModels = Collections.emptyList();
|
| + private int mActiveModelIndex = NORMAL_TAB_MODEL_INDEX;
|
| + private final ArrayList<ChangeListener> mChangeListeners = new ArrayList<ChangeListener>();
|
| +
|
| + protected final void initialize(boolean startIncognito, TabModel... models) {
|
| + // Only normal and incognito supported for now.
|
| + assert mTabModels.isEmpty();
|
| + assert models.length > 0;
|
| + if (startIncognito) {
|
| + assert models.length > INCOGNITO_TAB_MODEL_INDEX;
|
| + }
|
| +
|
| + List<TabModel> tabModels = new ArrayList<TabModel>();
|
| + for (int i = 0; i < models.length; i++) {
|
| + tabModels.add(models[i]);
|
| + }
|
| + mActiveModelIndex = startIncognito ? INCOGNITO_TAB_MODEL_INDEX : NORMAL_TAB_MODEL_INDEX;
|
| + mTabModels = Collections.unmodifiableList(tabModels);
|
| + }
|
| +
|
| + @Override
|
| + public void selectModel(boolean incognito) {
|
| + mActiveModelIndex = incognito ? INCOGNITO_TAB_MODEL_INDEX : NORMAL_TAB_MODEL_INDEX;
|
| + }
|
| +
|
| + @Override
|
| + public TabModel getModelAt(int index) {
|
| + assert (index < mTabModels.size() && index >= 0) :
|
| + "requested index " + index + " size " + mTabModels.size();
|
| + return mTabModels.get(index);
|
| + }
|
| +
|
| + @Override
|
| + public Tab getCurrentTab() {
|
| + return getCurrentModel() == null ? null : TabModelUtils.getCurrentTab(getCurrentModel());
|
| + }
|
| +
|
| + @Override
|
| + public int getCurrentTabId() {
|
| + Tab tab = getCurrentTab();
|
| + return tab != null ? tab.getId() : Tab.INVALID_TAB_ID;
|
| + }
|
| +
|
| + @Override
|
| + public TabModel getModelForTabId(int id) {
|
| + for (int i = 0; i < mTabModels.size(); i++) {
|
| + TabModel model = mTabModels.get(i);
|
| + if (TabModelUtils.getTabById(model, id) != null || model.isClosurePending(id)) {
|
| + return model;
|
| + }
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public TabModel getCurrentModel() {
|
| + return getModelAt(mActiveModelIndex);
|
| + }
|
| +
|
| + @Override
|
| + public int getCurrentModelIndex() {
|
| + return mActiveModelIndex;
|
| + }
|
| +
|
| + @Override
|
| + public TabModel getModel(boolean incognito) {
|
| + int index = incognito ? INCOGNITO_TAB_MODEL_INDEX : NORMAL_TAB_MODEL_INDEX;
|
| + return getModelAt(index);
|
| + }
|
| +
|
| + @Override
|
| + public boolean isIncognitoSelected() {
|
| + return mActiveModelIndex == INCOGNITO_TAB_MODEL_INDEX;
|
| + }
|
| +
|
| + @Override
|
| + public List<TabModel> getModels() {
|
| + return mTabModels;
|
| + }
|
| +
|
| + @Override
|
| + public boolean closeTab(Tab tab) {
|
| + for (int i = 0; i < getModels().size(); i++) {
|
| + TabModel model = getModelAt(i);
|
| + if (model.indexOf(tab) >= 0) {
|
| + return model.closeTab(tab);
|
| + }
|
| + }
|
| + assert false : "Tried to close a tab that is not in any model!";
|
| + return false;
|
| + }
|
| +
|
| + @Override
|
| + public void commitAllTabClosures() {
|
| + for (int i = 0; i < mTabModels.size(); i++) {
|
| + mTabModels.get(i).commitAllTabClosures();
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public Tab getTabById(int id) {
|
| + for (int i = 0; i < getModels().size(); i++) {
|
| + Tab tab = TabModelUtils.getTabById(getModelAt(i), id);
|
| + if (tab != null) return tab;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public void closeAllTabs() {
|
| + for (int i = 0; i < getModels().size(); i++) getModelAt(i).closeAllTabs();
|
| + }
|
| +
|
| + @Override
|
| + public int getTotalTabCount() {
|
| + int count = 0;
|
| + for (int i = 0; i < getModels().size(); i++) {
|
| + count += getModelAt(i).getCount();
|
| + }
|
| + return count;
|
| + }
|
| +
|
| + @Override
|
| + public void registerChangeListener(ChangeListener changeListener) {
|
| + if (!mChangeListeners.contains(changeListener)) mChangeListeners.add(changeListener);
|
| + }
|
| +
|
| + @Override
|
| + public void unregisterChangeListener(ChangeListener changeListener) {
|
| + mChangeListeners.remove(changeListener);
|
| + }
|
| +
|
| + /**
|
| + * Notifies all the listeners that the {@link TabModelSelector} or its {@link TabModel} has
|
| + * changed.
|
| + */
|
| + protected void notifyChanged() {
|
| + for (int i = 0; i < mChangeListeners.size(); i++) {
|
| + mChangeListeners.get(i).onChange();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Notifies all the listeners that a new tab has been created.
|
| + * @param tab The tab that has been created.
|
| + */
|
| + protected void notifyNewTabCreated(Tab tab) {
|
| + for (int i = 0; i < mChangeListeners.size(); i++) {
|
| + mChangeListeners.get(i).onNewTabCreated(tab);
|
| + }
|
| + }
|
| +}
|
|
|