154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov/*
254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov *
454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * you may not use this file except in compliance with the License.
654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * You may obtain a copy of the License at
754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov *
854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov *
1054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
1154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
1254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * See the License for the specific language governing permissions and
1454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * limitations under the License.
1554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov */
1654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovpackage com.android.contacts.widget;
1754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
1854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovimport android.database.DataSetObserver;
1954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovimport android.view.View;
2054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovimport android.view.ViewGroup;
2154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovimport android.widget.BaseAdapter;
2254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovimport android.widget.ListAdapter;
2354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
247039633999b3a46a87c851fa06d9168897ccc54bYorke Leeimport com.android.contacts.common.testing.NeededForTesting;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.google.common.annotations.VisibleForTesting;
26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
2754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov/**
2854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * A general purpose adapter that is composed of multiple sub-adapters. It just
2954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * appends them in the order they are added. It listens to changes from all
3054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov * sub-adapters and propagates them to its own listeners.
31a0290a4baab4297303cab3664c7abfd548f2e301Makoto Onuki *
32a0290a4baab4297303cab3664c7abfd548f2e301Makoto Onuki * This class not used for now -- but let's keep running the test in case we want to revive it...
33a0290a4baab4297303cab3664c7abfd548f2e301Makoto Onuki * (So NeededForTesting)
3454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov */
35a0290a4baab4297303cab3664c7abfd548f2e301Makoto Onuki@NeededForTesting
3654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikovpublic class CompositeListAdapter extends BaseAdapter {
3754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
3854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private static final int INITIAL_CAPACITY = 2;
3954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
4054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private ListAdapter[] mAdapters;
4154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private int[] mCounts;
4254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private int[] mViewTypeCounts;
4354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private int mSize = 0;
4454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private int mCount = 0;
4554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private int mViewTypeCount = 0;
4654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private boolean mAllItemsEnabled = true;
4754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private boolean mCacheValid = true;
4854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
4954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    private DataSetObserver mDataSetObserver = new DataSetObserver() {
5054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
5154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        @Override
5254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        public void onChanged() {
5354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            invalidate();
5454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            notifyDataChanged();
5554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
5654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
5754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        @Override
5854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        public void onInvalidated() {
5954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            invalidate();
6054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            notifyDataChanged();
6154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
6254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    };
6354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
6454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public CompositeListAdapter() {
6554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        this(INITIAL_CAPACITY);
6654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
6754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
6854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public CompositeListAdapter(int initialCapacity) {
6954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mAdapters = new ListAdapter[INITIAL_CAPACITY];
7054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCounts = new int[INITIAL_CAPACITY];
7154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mViewTypeCounts = new int[INITIAL_CAPACITY];
7254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
7354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
7437a2684d1e47f6d78d757c437a187548f242ee13Flavio Lerda    @VisibleForTesting
7537a2684d1e47f6d78d757c437a187548f242ee13Flavio Lerda    /*package*/ void addAdapter(ListAdapter adapter) {
7654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        if (mSize >= mAdapters.length) {
7754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int newCapacity = mSize + 2;
7854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            ListAdapter[] newAdapters = new ListAdapter[newCapacity];
7954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            System.arraycopy(mAdapters, 0, newAdapters, 0, mSize);
8054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mAdapters = newAdapters;
8154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
8254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int[] newCounts = new int[newCapacity];
8354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            System.arraycopy(mCounts, 0, newCounts, 0, mSize);
8454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mCounts = newCounts;
8554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
8654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int[] newViewTypeCounts = new int[newCapacity];
8754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            System.arraycopy(mViewTypeCounts, 0, newViewTypeCounts, 0, mSize);
8854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mViewTypeCounts = newViewTypeCounts;
8954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
9054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
9154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        adapter.registerDataSetObserver(mDataSetObserver);
9254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
9354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int count = adapter.getCount();
9454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int viewTypeCount = adapter.getViewTypeCount();
9554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
9654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mAdapters[mSize] = adapter;
9754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCounts[mSize] = count;
9854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCount += count;
9954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mAllItemsEnabled &= adapter.areAllItemsEnabled();
10054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mViewTypeCounts[mSize] = viewTypeCount;
10154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mViewTypeCount += viewTypeCount;
10254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mSize++;
10354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
10454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        notifyDataChanged();
10554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
10654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
10754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    protected void notifyDataChanged() {
10854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        if (getCount() > 0) {
10954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            notifyDataSetChanged();
11054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        } else {
11154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            notifyDataSetInvalidated();
11254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
11354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
11454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
11554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    protected void invalidate() {
11654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCacheValid = false;
11754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
11854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
11954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    protected void ensureCacheValid() {
12054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        if (mCacheValid) {
12154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            return;
12254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
12354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
12454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCount = 0;
12554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mAllItemsEnabled = true;
12654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mViewTypeCount = 0;
12754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mSize; i++) {
12854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int count = mAdapters[i].getCount();
12954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int viewTypeCount = mAdapters[i].getViewTypeCount();
13054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mCounts[i] = count;
13154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mCount += count;
13254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mAllItemsEnabled &= mAdapters[i].areAllItemsEnabled();
13354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            mViewTypeCount += viewTypeCount;
13454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
13554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
13654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        mCacheValid = true;
13754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
13854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
13954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public int getCount() {
14054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
14154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        return mCount;
14254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
14354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
14454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public Object getItem(int position) {
14554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
14654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int start = 0;
14754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mCounts.length; i++) {
14854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int end = start + mCounts[i];
14954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            if (position >= start && position < end) {
15054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                return mAdapters[i].getItem(position - start);
15154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            }
15254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            start = end;
15354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
15454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
15554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        throw new ArrayIndexOutOfBoundsException(position);
15654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
15754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
15854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public long getItemId(int position) {
15954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
16054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int start = 0;
16154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mCounts.length; i++) {
16254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int end = start + mCounts[i];
16354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            if (position >= start && position < end) {
16454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                return mAdapters[i].getItemId(position - start);
16554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            }
16654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            start = end;
16754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
16854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
16954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        throw new ArrayIndexOutOfBoundsException(position);
17054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
17154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
17254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    @Override
17354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public int getViewTypeCount() {
17454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
17554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        return mViewTypeCount;
17654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
17754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
17854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    @Override
17954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public int getItemViewType(int position) {
18054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
18154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int start = 0;
18254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int viewTypeOffset = 0;
18354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mCounts.length; i++) {
18454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int end = start + mCounts[i];
18554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            if (position >= start && position < end) {
18654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                return viewTypeOffset + mAdapters[i].getItemViewType(position - start);
18754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            }
18854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            viewTypeOffset += mViewTypeCounts[i];
18954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            start = end;
19054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
19154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
19254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        throw new ArrayIndexOutOfBoundsException(position);
19354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
19454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
19554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public View getView(int position, View convertView, ViewGroup parent) {
19654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
19754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int start = 0;
19854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mCounts.length; i++) {
19954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int end = start + mCounts[i];
20054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            if (position >= start && position < end) {
20154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                return mAdapters[i].getView(position - start, convertView, parent);
20254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            }
20354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            start = end;
20454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
20554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
20654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        throw new ArrayIndexOutOfBoundsException(position);
20754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
20854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
20954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    @Override
21054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public boolean areAllItemsEnabled() {
21154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
21254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        return mAllItemsEnabled;
21354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
21454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
21554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    @Override
21654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    public boolean isEnabled(int position) {
21754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        ensureCacheValid();
21854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        int start = 0;
21954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        for (int i = 0; i < mCounts.length; i++) {
22054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            int end = start + mCounts[i];
22154d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            if (position >= start && position < end) {
22254d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                return mAdapters[i].areAllItemsEnabled()
22354d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov                        || mAdapters[i].isEnabled(position - start);
22454d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            }
22554d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov            start = end;
22654d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        }
22754d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov
22854d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov        throw new ArrayIndexOutOfBoundsException(position);
22954d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov    }
23054d716f3ac9969d3126b878250d41f6fef472a47Dmitri Plotnikov}
231