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}