Index: chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..af7b42ba8fd35f8c665278a5c84a82f4af2bbfb2 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelAdapter.java |
@@ -0,0 +1,148 @@ |
+// 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.widget.accessibility; |
+ |
+import android.content.Context; |
+import android.view.LayoutInflater; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.widget.BaseAdapter; |
+ |
+import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.tabmodel.TabList; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.tabmodel.TabModelUtils; |
+import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelListItem.AccessibilityTabModelListItemListener; |
+ |
+/** |
+ * An instance of a {@link BaseAdapter} that represents a {@link TabModel}. |
+ */ |
+public class AccessibilityTabModelAdapter extends BaseAdapter { |
+ private final Context mContext; |
+ |
+ private TabList mUndoneTabModel; |
+ private TabModel mActualTabModel; |
+ private AccessibilityTabModelAdapterListener mListener; |
+ private final AccessibilityTabModelListView mCanScrollListener; |
+ |
+ /** |
+ * An interface used to notify that the {@link Tab} specified by {@code tabId} should be |
+ * shown. |
+ */ |
+ public interface AccessibilityTabModelAdapterListener { |
+ /** |
+ * Show the {@link Tab} specified by {@code tabId}. |
+ * @param tabId The id of the {@link Tab} that should be shown. |
+ */ |
+ void showTab(int tabId); |
+ } |
+ |
+ private final AccessibilityTabModelListItemListener mInternalListener = |
+ new AccessibilityTabModelListItemListener() { |
+ @Override |
+ public void tabSelected(int tab) { |
+ TabModelUtils.setIndex(mActualTabModel, |
+ TabModelUtils.getTabIndexById(mActualTabModel, tab)); |
+ if (mListener != null) mListener.showTab(tab); |
+ notifyDataSetChanged(); |
+ } |
+ |
+ @Override |
+ public void tabClosed(int tab) { |
+ if (mActualTabModel.isClosurePending(tab)) { |
+ mActualTabModel.commitTabClosure(tab); |
+ } else { |
+ TabModelUtils.closeTabById(mActualTabModel, tab); |
+ } |
+ notifyDataSetChanged(); |
+ } |
+ |
+ @Override |
+ public boolean hasPendingClosure(int tab) { |
+ return mUndoneTabModel.isClosurePending(tab); |
+ } |
+ |
+ @Override |
+ public void schedulePendingClosure(int tab) { |
+ mActualTabModel.closeTab( |
+ TabModelUtils.getTabById(mActualTabModel, tab), true, false, true); |
+ } |
+ |
+ @Override |
+ public void cancelPendingClosure(int tab) { |
+ mActualTabModel.cancelTabClosure(tab); |
+ } |
+ |
+ @Override |
+ public void tabChanged(int tabId) { |
+ notifyDataSetChanged(); |
+ } |
+ }; |
+ |
+ /** |
+ * @param context The Context to use to inflate {@link View}s in. |
+ */ |
+ public AccessibilityTabModelAdapter(Context context, |
+ AccessibilityTabModelListView listener) { |
+ mContext = context; |
+ mCanScrollListener = listener; |
+ } |
+ |
+ /** |
+ * @param tabModel The TabModel that this adapter should represent. |
+ */ |
+ public void setTabModel(TabModel tabModel) { |
+ mActualTabModel = tabModel; |
+ mUndoneTabModel = tabModel.getComprehensiveModel(); |
+ notifyDataSetChanged(); |
+ } |
+ |
+ /** |
+ * Registers a listener that will be notified when this adapter wants to show a tab. |
+ * @param listener The listener to be notified of show events. |
+ */ |
+ public void setListener(AccessibilityTabModelAdapterListener listener) { |
+ mListener = listener; |
+ } |
+ |
+ @Override |
+ public int getCount() { |
+ return mUndoneTabModel != null ? mUndoneTabModel.getCount() : 0; |
+ } |
+ |
+ @Override |
+ public Object getItem(int position) { |
+ return new Object(); |
+ } |
+ |
+ @Override |
+ public long getItemId(int position) { |
+ return mUndoneTabModel != null ? |
+ mUndoneTabModel.getTabAt(position).getId() : Tab.INVALID_TAB_ID; |
+ } |
+ |
+ @Override |
+ public View getView(int position, View convertView, ViewGroup parent) { |
+ int tabId = (int) getItemId(position); |
+ |
+ if (tabId == Tab.INVALID_TAB_ID) return null; |
+ |
+ AccessibilityTabModelListItem listItem = null; |
+ if (convertView != null && convertView instanceof AccessibilityTabModelListItem) { |
+ listItem = (AccessibilityTabModelListItem) convertView; |
+ } else { |
+ listItem = (AccessibilityTabModelListItem) LayoutInflater.from(mContext).inflate( |
+ R.layout.accessibility_tab_switcher_list_item, null, false); |
+ } |
+ |
+ listItem.setTab(TabModelUtils.getTabById(mUndoneTabModel, tabId), |
+ mActualTabModel.supportsPendingClosures()); |
+ listItem.setListeners(mInternalListener, mCanScrollListener); |
+ listItem.resetState(); |
+ |
+ return listItem; |
+ } |
+} |