Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java

Issue 270883002: Upstream base implementations of TabModel, TabModelSelector, and TabModelObserver. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698