19b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa/*
29b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * Copyright (C) 2011 Google Inc.
39b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * Licensed to The Android Open Source Project.
49b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa *
59b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
69b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * you may not use this file except in compliance with the License.
79b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * You may obtain a copy of the License at
89b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa *
99b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
109b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa *
119b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
129b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
139b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * See the License for the specific language governing permissions and
159b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * limitations under the License.
169b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa */
179b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawapackage com.android.contacts.list;
189b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
199b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport com.android.contacts.R;
209b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
219b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.content.Context;
229b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.content.res.Resources;
239b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.database.DataSetObserver;
249b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.view.View;
259b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.view.ViewGroup;
269b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.widget.BaseAdapter;
279b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.widget.FrameLayout;
289b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawaimport android.widget.SectionIndexer;
299b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
309b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa/**
319b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * An adapter that combines items from {@link ContactTileAdapter} and
329b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * {@link ContactEntryListAdapter} into a single list. In between those two results,
339b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa * an account filter header will be inserted.
349b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa */
359b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawapublic class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIndexer {
369b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
379b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private class CustomDataSetObserver extends DataSetObserver {
389b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        @Override
399b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        public void onChanged() {
409b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            notifyDataSetChanged();
419b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
429b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
439b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
449b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final ContactTileAdapter mContactTileAdapter;
459b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final ContactEntryListAdapter mContactEntryListAdapter;
469b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final View mAccountFilterHeaderContainer;
479b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
489b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final int mItemPaddingLeft;
499b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final int mItemPaddingRight;
509b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
515db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa    // Make frequent header consistent with account filter header.
525db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa    private final int mFrequentHeaderPaddingTop;
535db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa
549b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    private final DataSetObserver mObserver;
559b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
569b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public PhoneFavoriteMergedAdapter(Context context,
579b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            ContactTileAdapter contactTileAdapter,
589b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            View accountFilterHeaderContainer,
599b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            ContactEntryListAdapter contactEntryListAdapter) {
609b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        Resources resources = context.getResources();
619b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mItemPaddingLeft = resources.getDimensionPixelSize(R.dimen.detail_item_side_margin);
629b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mItemPaddingRight = resources.getDimensionPixelSize(R.dimen.list_visible_scrollbar_padding);
635db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa        mFrequentHeaderPaddingTop = resources.getDimensionPixelSize(
645db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa                R.dimen.contact_browser_list_top_margin);
659b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mContactTileAdapter = contactTileAdapter;
669b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mContactEntryListAdapter = contactEntryListAdapter;
679b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
689b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mAccountFilterHeaderContainer = accountFilterHeaderContainer;
699b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
709b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mObserver = new CustomDataSetObserver();
719b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mContactTileAdapter.registerDataSetObserver(mObserver);
729b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        mContactEntryListAdapter.registerDataSetObserver(mObserver);
739b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
749b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
759b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
769b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public int getCount() {
779b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
789b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount();
799b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        if (mContactEntryListAdapter.isLoading()) {
809b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            // Hide "all" contacts during its being loaded.
819b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return contactTileAdapterCount + 1;
829b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
839b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return contactTileAdapterCount + contactEntryListAdapterCount + 1;
849b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
859b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
869b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
879b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
889b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public Object getItem(int position) {
899b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
909b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount();
919b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        if (position < contactTileAdapterCount) {
929b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactTileAdapter.getItem(position);
939b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else if (position == contactTileAdapterCount) {
949b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mAccountFilterHeaderContainer;
959b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
969b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int localPosition = position - contactTileAdapterCount - 1;
979b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactTileAdapter.getItem(localPosition);
989b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
999b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1009b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1019b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1029b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public long getItemId(int position) {
1039b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        return position;
1049b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1059b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1069b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1079b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public int getViewTypeCount() {
1089b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        return (mContactTileAdapter.getViewTypeCount()
1099b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                + mContactEntryListAdapter.getViewTypeCount()
1109b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                + 1);
1119b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1129b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1139b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1149b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public int getItemViewType(int position) {
1159b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
1169b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount();
1179b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        if (position < contactTileAdapterCount) {
1189b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactTileAdapter.getItemViewType(position);
1199b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else if (position == contactTileAdapterCount) {
1209b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactTileAdapter.getViewTypeCount()
1219b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                    + mContactEntryListAdapter.getViewTypeCount();
1229b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
1239b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int localPosition = position - contactTileAdapterCount - 1;
1249b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int type = mContactEntryListAdapter.getItemViewType(localPosition);
1259b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            // IGNORE_ITEM_VIEW_TYPE must be handled differently.
1269b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return (type < 0) ? type : type + mContactTileAdapter.getViewTypeCount();
1279b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
1289b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1299b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1309b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1319b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public View getView(int position, View convertView, ViewGroup parent) {
1329b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
1339b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount();
1349b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1359b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        // Obtain a View relevant for that position, and adjust its horizontal padding. Each
1369b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        // View has different implementation, so we use different way to control those padding.
1379b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        if (position < contactTileAdapterCount) {
1389b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final View view = mContactTileAdapter.getView(position, convertView, parent);
1399b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int frequentHeaderPosition = mContactTileAdapter.getFrequentHeaderPosition();
1409b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            if (position < frequentHeaderPosition) {  // "starred" contacts
1419b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                // No padding adjustment.
1429b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            } else if (position == frequentHeaderPosition) {
1435db4f136163675105813900b1f3f7da48bde97b6Daisuke Miyakawa                view.setPadding(mItemPaddingLeft, mFrequentHeaderPaddingTop,
1449b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                        mItemPaddingRight, view.getPaddingBottom());
1459b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            } else {
1469b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                // Views for "frequent" contacts use FrameLayout's margins instead of padding.
1479b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                final FrameLayout frameLayout = (FrameLayout) view;
1489b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                final View child = frameLayout.getChildAt(0);
1499b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
1509b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                        FrameLayout.LayoutParams.WRAP_CONTENT,
1519b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                        FrameLayout.LayoutParams.WRAP_CONTENT);
1529b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                params.setMargins(mItemPaddingLeft, 0, mItemPaddingRight, 0);
1539b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                child.setLayoutParams(params);
1549b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            }
1559b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return view;
1569b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else if (position == contactTileAdapterCount) {
1579b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            mAccountFilterHeaderContainer.setPadding(mItemPaddingLeft,
1589b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                    mAccountFilterHeaderContainer.getPaddingTop(),
1599b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                    mItemPaddingRight,
1609b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                    mAccountFilterHeaderContainer.getPaddingBottom());
1619b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mAccountFilterHeaderContainer;
1629b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
1639b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int localPosition = position - contactTileAdapterCount - 1;
1649b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final ContactListItemView itemView = (ContactListItemView)
1659b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                    mContactEntryListAdapter.getView(localPosition, convertView, null);
1662eb1be625832f77ba9c6a3e9dc13b2ecf3f25214Daisuke Miyakawa            itemView.setPadding(mItemPaddingLeft, itemView.getPaddingTop(),
1672eb1be625832f77ba9c6a3e9dc13b2ecf3f25214Daisuke Miyakawa                    mItemPaddingRight, itemView.getPaddingBottom());
1689b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            itemView.setSelectionBoundsHorizontalMargin(mItemPaddingLeft, mItemPaddingRight);
1699b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return itemView;
1709b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
1719b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1729b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1739b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1749b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public boolean areAllItemsEnabled() {
1759b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        return (mContactTileAdapter.areAllItemsEnabled()
1769b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                && mAccountFilterHeaderContainer.isEnabled()
1779b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa                && mContactEntryListAdapter.areAllItemsEnabled());
1789b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1799b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1809b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1819b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public boolean isEnabled(int position) {
1829b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
1839b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactEntryListAdapterCount = mContactEntryListAdapter.getCount();
1849b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        if (position < contactTileAdapterCount) {
1859b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactTileAdapter.isEnabled(position);
1869b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else if (position == contactTileAdapterCount) {
18734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            // This will be handled by View's onClick event instead of ListView's onItemClick event.
18834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa            return false;
1899b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
190c6779501ce47f95f6271c3a468071cc401368f60Daisuke Miyakawa            final int localPosition = position - contactTileAdapterCount - 1;
1919b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return mContactEntryListAdapter.isEnabled(localPosition);
1929b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
1939b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
1949b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
1959b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
1969b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public int getPositionForSection(int sectionIndex) {
1979b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
1981dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        final int localPosition = mContactEntryListAdapter.getPositionForSection(sectionIndex);
1991dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        return contactTileAdapterCount + 1 + localPosition;
2009b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
2019b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
2029b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
2039b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public int getSectionForPosition(int position) {
2049b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
2051dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        if (position <= contactTileAdapterCount) {
2069b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            return 0;
2079b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        } else {
2089b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa            final int localPosition = position - contactTileAdapterCount - 1;
2091dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa            return mContactEntryListAdapter.getSectionForPosition(localPosition);
2109b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa        }
2119b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
2129b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa
2139b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    @Override
2149b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    public Object[] getSections() {
2151dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        return mContactEntryListAdapter.getSections();
2161dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa    }
2171dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa
2181dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa    public boolean shouldShowFirstScroller(int firstVisibleItem) {
2191dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        final int contactTileAdapterCount = mContactTileAdapter.getCount();
2201dff6b60c28fa34e477b84c95c4bbe6c9b482416Daisuke Miyakawa        return firstVisibleItem > contactTileAdapterCount;
2219b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa    }
2229b9104874ec0680ac60cb0527d127fc1c34bdb7eDaisuke Miyakawa}