[Phone] Conditionally show fast scroller on favorite

Bug: 5438604
Change-Id: If04d438a4b2d3d3218e422f06ec3008ccb6caf7f
diff --git a/src/com/android/contacts/list/PhoneFavoriteFragment.java b/src/com/android/contacts/list/PhoneFavoriteFragment.java
index 41be5fa..5e53eb8 100644
--- a/src/com/android/contacts/list/PhoneFavoriteFragment.java
+++ b/src/com/android/contacts/list/PhoneFavoriteFragment.java
@@ -32,13 +32,13 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
-import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ListView;
@@ -158,6 +158,25 @@
         }
     }
 
+    private class ScrollListener implements ListView.OnScrollListener {
+        private boolean mShouldShowFastScroller;
+        @Override
+        public void onScroll(AbsListView view,
+                int firstVisibleItem, int visibleItemCount, int totalItemCount) {
+            // FastScroller should be visible only when the user is seeing "all" contacts section.
+            final boolean shouldShow = mAdapter.shouldShowFirstScroller(firstVisibleItem);
+            if (shouldShow != mShouldShowFastScroller) {
+                mListView.setFastScrollEnabled(shouldShow);
+                mListView.setFastScrollAlwaysVisible(shouldShow);
+                mShouldShowFastScroller = shouldShow;
+            }
+        }
+
+        @Override
+        public void onScrollStateChanged(AbsListView view, int scrollState) {
+        }
+    }
+
     private Listener mListener;
     private PhoneFavoriteMergedAdapter mAdapter;
     private ContactTileAdapter mContactTileAdapter;
@@ -192,6 +211,7 @@
     private final OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener();
     private final ContactsPreferenceChangeListener mContactsPreferenceChangeListener =
             new ContactsPreferenceChangeListener();
+    private final ScrollListener mScrollListener = new ScrollListener();
 
     @Override
     public void onCreate(Bundle savedState) {
@@ -223,9 +243,6 @@
         mListView = (ListView) listLayout.findViewById(R.id.contact_tile_list);
         mListView.setItemsCanFocus(true);
         mListView.setOnItemClickListener(this);
-        mListView.setFastScrollEnabled(true);
-        // We want to hide the scroll bar after a while.
-        mListView.setFastScrollAlwaysVisible(false);
         mListView.setVerticalScrollBarEnabled(true);
         mListView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
         mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
@@ -234,6 +251,10 @@
 
         mListView.setAdapter(mAdapter);
 
+        mListView.setOnScrollListener(mScrollListener);
+        mListView.setFastScrollEnabled(false);
+        mListView.setFastScrollAlwaysVisible(false);
+
         mEmptyView = (TextView) listLayout.findViewById(R.id.contact_tile_list_empty);
         mEmptyView.setText(getString(R.string.listTotalAllContactsZero));
         mListView.setEmptyView(mEmptyView);
diff --git a/src/com/android/contacts/list/PhoneFavoriteMergedAdapter.java b/src/com/android/contacts/list/PhoneFavoriteMergedAdapter.java
index 668bd6c..25a158b 100644
--- a/src/com/android/contacts/list/PhoneFavoriteMergedAdapter.java
+++ b/src/com/android/contacts/list/PhoneFavoriteMergedAdapter.java
@@ -34,11 +34,6 @@
  */
 public class PhoneFavoriteMergedAdapter extends BaseAdapter implements SectionIndexer {
 
-    // Should show nothing as SectionIndex.
-    // " " will suppress the section indexer itself: nothing will be shown during user's scroll.
-    private static final String SECTION_STRING_STARRED = " ";
-    private static final String SECTION_STRING_FREQUENT = " ";
-
     private class CustomDataSetObserver extends DataSetObserver {
         @Override
         public void onChanged() {
@@ -200,42 +195,28 @@
     @Override
     public int getPositionForSection(int sectionIndex) {
         final int contactTileAdapterCount = mContactTileAdapter.getCount();
-        if (sectionIndex == 0) {  // "starred" section
-            return 0;
-        } else if (sectionIndex == 1) {  // "frequent" section
-            return mContactTileAdapter.getFrequentHeaderPosition();
-        } else {
-            final int localSection = sectionIndex - 2;
-            final int localPosition = mContactEntryListAdapter.getPositionForSection(localSection);
-            return contactTileAdapterCount + 1 + localPosition;
-        }
+        final int localPosition = mContactEntryListAdapter.getPositionForSection(sectionIndex);
+        return contactTileAdapterCount + 1 + localPosition;
     }
 
     @Override
     public int getSectionForPosition(int position) {
         final int contactTileAdapterCount = mContactTileAdapter.getCount();
-        if (position < contactTileAdapterCount) {
+        if (position <= contactTileAdapterCount) {
             return 0;
-        } else if (position == contactTileAdapterCount) {
-            return 1;
         } else {
             final int localPosition = position - contactTileAdapterCount - 1;
-            final int localSection = mContactEntryListAdapter.getSectionForPosition(localPosition);
-            return localSection + 2;
+            return mContactEntryListAdapter.getSectionForPosition(localPosition);
         }
     }
 
     @Override
     public Object[] getSections() {
-        // Copy sections from "all" contacts, and add two additional sections for "starred", and
-        // "frequent". Those new sections should not show anything as an indexer, but should
-        // let users select those sections with a vertical scroll.
-        final Object[] contactEntrySections = mContactEntryListAdapter.getSections();
-        final Object[] ret = new Object[contactEntrySections.length + 2];
-        System.arraycopy(contactEntrySections, 0, ret, 2, contactEntrySections.length);
+        return mContactEntryListAdapter.getSections();
+    }
 
-        ret[0] = SECTION_STRING_STARRED;
-        ret[1] = SECTION_STRING_FREQUENT;
-        return ret;
+    public boolean shouldShowFirstScroller(int firstVisibleItem) {
+        final int contactTileAdapterCount = mContactTileAdapter.getCount();
+        return firstVisibleItem > contactTileAdapterCount;
     }
 }
\ No newline at end of file