// 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.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) {
if (mListener != null) mListener.showTab(tab);
TabModelUtils.setIndex(mActualTabModel,
TabModelUtils.getTabIndexById(mActualTabModel, 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);
notifyDataSetChanged();
}
@Override
public void cancelPendingClosure(int tab) {
mActualTabModel.cancelTabClosure(tab);
notifyDataSetChanged();
}
@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);
assert tabId != Tab.INVALID_TAB_ID;
AccessibilityTabModelListItem listItem;
if (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;
}
}