Showing contact count above the contact list

Change-Id: I5eb7632660254aa176129a01c1db490941ff521a
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 0f95779..c963b83 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -22,11 +22,9 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
-import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ListView;
 import android.widget.TextView;
 
 /**
@@ -119,10 +117,42 @@
     @Override
     protected View createView(LayoutInflater inflater, ViewGroup container) {
         View view = super.createView(inflater, container);
-        getListView().addHeaderView(inflater.inflate(R.layout.total_contacts, null, false));
+        if (!isSearchResultsMode()) {
+            // In the search-results mode the count is shown in the fat header above the list
+            getListView().addHeaderView(inflater.inflate(R.layout.total_contacts, null, false));
+        }
         return view;
     }
 
+    @Override
+    protected void showCount(Cursor data) {
+        int count = data.getCount();
+        if (isSearchMode()) {
+            TextView textView = (TextView) getView().findViewById(R.id.totalContactsText);
+            // TODO
+            // if (TextUtils.isEmpty(getQueryString())) {
+            String text = getQuantityText(count, R.string.listFoundAllContactsZero,
+                    R.plurals.searchFoundContacts);
+            textView.setText(text);
+        }
+        else if (isSearchResultsMode()) {
+            TextView countText = (TextView)getView().findViewById(R.id.search_results_found);
+            String text = getQuantityText(data.getCount(),
+                    R.string.listFoundAllContactsZero, R.plurals.listFoundAllContacts);
+            countText.setText(text);
+        } else {
+            // TODO
+            // if (contactsListActivity.mDisplayOnlyPhones) {
+            // text = contactsListActivity.getQuantityText(count,
+            // R.string.listTotalPhoneContactsZero,
+            // R.plurals.listTotalPhoneContacts);
+            TextView textView = (TextView)getView().findViewById(R.id.totalContactsText);
+            String text = getQuantityText(count, R.string.listTotalAllContactsZero,
+                    R.plurals.listTotalAllContacts);
+            textView.setText(text);
+        }
+    }
+
     public void setEditMode(boolean flag) {
         mEditMode = flag;
     }
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 175d352..9a3bf1d 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -90,6 +90,12 @@
 
     protected abstract View inflateView(LayoutInflater inflater, ViewGroup container);
     protected abstract T createListAdapter();
+
+    /**
+     * @param position Please note that the position is already adjusted for
+     *            header views, so "0" means the first list item below header
+     *            views.
+     */
     protected abstract void onItemClick(int position, long id);
 
     public T getAdapter() {
@@ -105,6 +111,10 @@
         ((ContactsListActivity)getActivity()).setupListView(mAdapter, mListView);
     }
 
+    public View getView() {
+        return mView;
+    }
+
     public ListView getListView() {
         return mListView;
     }
@@ -122,32 +132,17 @@
 
     @Override
     protected void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-        if (data != null && isSearchResultsMode()) {
-            TextView foundContactsText = (TextView)mView.findViewById(R.id.search_results_found);
-            String text = getQuantityText(data.getCount(),
-                    R.string.listFoundAllContactsZero, R.plurals.listFoundAllContacts);
-            foundContactsText.setText(text);
-
-            TextView totalContacts = (TextView) mView.findViewById(R.id.totalContactsText);
-
-            int count = data.getCount();
-
-            if (isSearchMode()
-                    && !TextUtils.isEmpty(getQueryString())) {
-                text = getQuantityText(count, R.string.listFoundAllContactsZero,
-                        R.plurals.searchFoundContacts);
-            } else {
-                // TODO
-//            if (contactsListActivity.mDisplayOnlyPhones) {
-//                text = contactsListActivity.getQuantityText(count,
-//                        R.string.listTotalPhoneContactsZero, R.plurals.listTotalPhoneContacts);
-//            } else {
-                text = getQuantityText(count,
-                        R.string.listTotalAllContactsZero, R.plurals.listTotalAllContacts);
-//            }
-            }
-            totalContacts.setText(text);
+        if (data == null) {
+            return;
         }
+
+        showCount(data);
+    }
+
+    /**
+     * Shows the count of entries included in the list.
+     */
+    protected void showCount(Cursor data) {
     }
 
     protected void reloadData() {
@@ -348,7 +343,10 @@
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         hideSoftKeyboard();
 
-        onItemClick(position, id);
+        int adjPosition = position - mListView.getHeaderViewsCount();
+        if (adjPosition >= 0) {
+            onItemClick(adjPosition, id);
+        }
     }
 
     private void hideSoftKeyboard() {
diff --git a/src/com/android/contacts/widget/PinnedHeaderListView.java b/src/com/android/contacts/widget/PinnedHeaderListView.java
index 9562714..80db26f 100644
--- a/src/com/android/contacts/widget/PinnedHeaderListView.java
+++ b/src/com/android/contacts/widget/PinnedHeaderListView.java
@@ -87,6 +87,8 @@
 
     private OnScrollListener mOnScrollListener;
 
+    private boolean mHeaderViewConfigured;
+
     public PinnedHeaderListView(Context context) {
         super(context);
     }
@@ -110,6 +112,7 @@
         if (mHeaderView != null) {
             setFadingEdgeLength(0);
         }
+        mHeaderViewConfigured = false;
         requestLayout();
     }
 
@@ -131,6 +134,9 @@
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         if (mHeaderView != null) {
+            if (!mHeaderViewConfigured) {
+                configureHeaderView(getFirstVisiblePosition() - getHeaderViewsCount());
+            }
             measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);
             mHeaderViewWidth = mHeaderView.getMeasuredWidth();
             mHeaderViewHeight = mHeaderView.getMeasuredHeight();
@@ -141,7 +147,9 @@
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
         if (mHeaderView != null) {
-            configureHeaderView(getFirstVisiblePosition() - getHeaderViewsCount());
+            if (!mHeaderViewConfigured) {
+                configureHeaderView(getFirstVisiblePosition() - getHeaderViewsCount());
+            }
             mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);
         }
     }
@@ -198,6 +206,7 @@
                 break;
             }
         }
+        mHeaderViewConfigured = true;
     }
 
     @Override