Frequent contacts now display as a single list item per row.

Change-Id: I5a4812d5b01d76368da56e0506df638089932e7e
diff --git a/res/layout/contact_tile_small.xml b/res/layout/contact_tile_single.xml
similarity index 76%
rename from res/layout/contact_tile_small.xml
rename to res/layout/contact_tile_single.xml
index 9eda2cf..e1bdccc 100644
--- a/res/layout/contact_tile_small.xml
+++ b/res/layout/contact_tile_single.xml
@@ -17,28 +17,28 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     class="com.android.contacts.list.ContactTileView"
     android:focusable="true"
-    android:padding="5dip"
-    android:background="@drawable/list_selector" >
+    android:background="@drawable/list_selector"
+    android:paddingRight="16dip"
+    android:paddingLeft="16dip" >
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
 
-        <ImageView
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:id="@+id/contact_tile_image"
-            android:gravity="top"
-            android:scaleType="centerCrop" />
-
         <TextView
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
             android:id="@+id/contact_tile_name"
-            android:paddingTop="8dip"
-            android:paddingLeft="4dip" />
+            android:layout_width="0dip"
+            android:layout_height="fill_parent"
+            android:layout_weight="1"
+            android:textSize="18sp"
+            android:textColor="#333333"
+            android:paddingTop="24dip" />
+
+        <ImageView
+            android:id="@+id/contact_tile_image"
+            android:layout_width="64dip"
+            android:layout_height="64dip"
+            android:scaleType="centerCrop" />
 
     </LinearLayout>
 
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index f3d7dae..feb308c 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -86,7 +86,7 @@
 
         /**
          * Display only most frequently contacted in a
-         * small {@link ContactTileView} layout.
+         * single {@link ContactTileView} layout.
          */
         FREQUENT_ONLY,
 
@@ -192,10 +192,21 @@
 
     @Override
     public int getCount() {
-        int numRows = getNumRows(mContacts2.size()) + getNumRows(mContacts.size());
+        // Addin Containter (if any) that always has multi columns
+        int rowCount = getNumRows(mContacts2.size());
+
+        if (mDisplayType == DisplayType.FREQUENT_ONLY || mDisplayType == DisplayType.STREQUENT) {
+            // Adding Container that has single columns
+            rowCount += mContacts.size();
+        } else {
+            // Adding Containter that has multi columns
+            rowCount += getNumRows(mContacts.size());
+        }
+
         // Adding Divider Row if Neccessary
-        if (mDisplayType == DisplayType.STREQUENT && mContacts.size() > 0) numRows++;
-        return numRows;
+        if (mDisplayType == DisplayType.STREQUENT && mContacts.size() > 0) rowCount++;
+
+        return rowCount;
     }
 
     /**
@@ -223,6 +234,9 @@
         } else {
             if (mDisplayType == DisplayType.STREQUENT) {
                 contactIndex = (position - mDividerRowIndex - 1) * mColumnCount;
+
+                resultList.add(mContacts.get(position - mDividerRowIndex - 1));
+                return resultList;
             }
             contactList = mContacts;
         }
@@ -259,24 +273,37 @@
 
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
+        int itemViewType = getItemViewType(position);
 
-        // Checking position to draw the divider
-        if (position == mDividerRowIndex) {
+        if (itemViewType == ViewTypes.DIVIDER) {
+            // Checking For Divider First so not to cast convertView
             return convertView == null ? createDivider() : convertView;
         }
 
         ContactTileRow contactTileRowView = (ContactTileRow) convertView;
         ArrayList<ContactEntry> contactList = getItem(position);
+        int layoutResId = getLayoutResourceId(itemViewType);
+        int columnCount = -1;
 
-        // Creating new row if needed
-        if (contactTileRowView == null) {
-            int itemViewType = getItemViewType(position);
-            int layoutResId = getLayoutResourceId(itemViewType);
-            contactTileRowView = new ContactTileRow(mContext, layoutResId,
-                    itemViewType == ViewTypes.REGULAR);
+        switch (itemViewType) {
+            case ViewTypes.REGULAR:
+                if (contactTileRowView == null) {
+                    // Creating new row if needed
+                    contactTileRowView = new ContactTileRow(mContext, layoutResId, true);
+                }
+                columnCount = mColumnCount;
+                break;
+
+            case ViewTypes.SINGLE_ROW:
+                if (contactTileRowView == null) {
+                    // Creating new row if needed
+                    contactTileRowView = new ContactTileRow(mContext, layoutResId, false);
+                }
+                columnCount = 1;
+                break;
         }
 
-        contactTileRowView.configureRow(contactList);
+        contactTileRowView.configureRow(contactList, columnCount);
         return contactTileRowView;
     }
 
@@ -294,10 +321,10 @@
 
     private int getLayoutResourceId(int viewType) {
         switch (viewType) {
-            case ViewTypes.SMALL:
-                return R.layout.contact_tile_small;
             case ViewTypes.REGULAR:
                 return R.layout.contact_tile_regular;
+            case ViewTypes.SINGLE_ROW:
+                return R.layout.contact_tile_single;
             default:
                 throw new IllegalArgumentException("Received unrecognized viewType " + viewType);
         }
@@ -324,13 +351,13 @@
                 } else if (position == mDividerRowIndex) {
                     return ViewTypes.DIVIDER;
                 } else {
-                    return ViewTypes.SMALL;
+                    return ViewTypes.SINGLE_ROW;
                 }
             case STARRED_ONLY:
             case GROUP_MEMBERS:
                 return ViewTypes.REGULAR;
             case FREQUENT_ONLY:
-                return ViewTypes.SMALL;
+                return ViewTypes.SINGLE_ROW;
             default:
                 throw new IllegalStateException(
                         "Received unrecognized DisplayType " + mDisplayType);
@@ -353,9 +380,9 @@
         /**
          * Configures the row to add {@link ContactEntry}s information to the views
          */
-        public void configureRow(ArrayList<ContactEntry> list) {
+        public void configureRow(ArrayList<ContactEntry> list, int columnCount) {
             // Adding tiles to row and filling in contact information
-            for (int columnCounter = 0; columnCounter < mColumnCount; columnCounter++) {
+            for (int columnCounter = 0; columnCounter < columnCount; columnCounter++) {
                 ContactEntry entry =
                         columnCounter < list.size() ? list.get(columnCounter) : null;
                 addTileFromEntry(entry, columnCounter);
@@ -397,9 +424,9 @@
 
     private static class ViewTypes {
         public static final int COUNT = 3;
-        public static final int SMALL = 0;
-        public static final int REGULAR = 1;
-        public static final int DIVIDER = 2;
+        public static final int REGULAR = 0;
+        public static final int DIVIDER = 1;
+        public static final int SINGLE_ROW = 2;
     }
 
     public interface Listener {
diff --git a/src/com/android/contacts/list/ContactTileView.java b/src/com/android/contacts/list/ContactTileView.java
index 4cce82e..da1351f 100644
--- a/src/com/android/contacts/list/ContactTileView.java
+++ b/src/com/android/contacts/list/ContactTileView.java
@@ -34,11 +34,16 @@
 public class ContactTileView extends FrameLayout {
     private final static String TAG = "ContactTileView";
 
+    /**
+     * This divides into the width to define the height when
+     * {link DisplayTypes@SINLGE_ROW} is true.
+     */
+    private final static int HEIGHT_RATIO = 5;
     private Uri mLookupUri;
     private ImageView mPhoto;
     private TextView mName;
     private ContactPhotoManager mPhotoManager = null;
-    /*
+    /**
      * Is set to true if the {@link ContactTileView} is a square.
      * A {@link ViewType#REGULAR} is displayed as a square.
      */
@@ -95,6 +100,6 @@
         int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
         int childMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
         measureChildren(childMeasureSpec, childMeasureSpec);
-        setMeasuredDimension(width, width / (mIsSquare ? 1 : 2));
+        setMeasuredDimension(width, width / (mIsSquare ? 1 : HEIGHT_RATIO));
     }
 }