Added QuickContacts.

Change-Id: I0bf3b536da73c2f9862a958ff0275ef8404def4f
diff --git a/res/layout/contact_tile_single.xml b/res/layout/contact_tile_frequent.xml
similarity index 95%
rename from res/layout/contact_tile_single.xml
rename to res/layout/contact_tile_frequent.xml
index 7147f3c..4ba7396 100644
--- a/res/layout/contact_tile_single.xml
+++ b/res/layout/contact_tile_frequent.xml
@@ -36,8 +36,8 @@
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:paddingTop="24dip" />
 
-        <ImageView
-            android:id="@+id/contact_tile_image"
+        <QuickContactBadge
+            android:id="@+id/contact_tile_quick"
             android:layout_width="64dip"
             android:layout_height="64dip"
             android:scaleType="centerCrop" />
diff --git a/res/layout/contact_tile_square.xml b/res/layout/contact_tile_square.xml
deleted file mode 100644
index ca79cef..0000000
--- a/res/layout/contact_tile_square.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<view
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.list.ContactTileSquareView"
-    android:focusable="true"
-    android:padding="1px"
-    android:background="@drawable/list_selector" >
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <ImageView
-            android:id="@+id/contact_tile_image"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:scaleType="centerCrop" />
-
-        <View
-            android:id="@+id/contact_tile_background"
-            android:layout_width="match_parent"
-            android:layout_height="48dip"
-            android:layout_alignParentBottom="true"
-            android:layout_alignParentLeft="true"
-            android:alpha="0.5"
-            android:background="@android:color/black" />
-
-        <TextView
-            android:id="@+id/contact_tile_name"
-            android:layout_width="match_parent"
-            android:layout_height="48dip"
-            android:layout_alignParentBottom="true"
-            android:layout_alignParentLeft="true"
-            android:gravity="center_vertical"
-            android:paddingLeft="8dip"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textColor="@android:color/white"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    </RelativeLayout>
-
-</view>
diff --git a/res/layout/contact_tile_single.xml b/res/layout/contact_tile_starred.xml
similarity index 60%
copy from res/layout/contact_tile_single.xml
copy to res/layout/contact_tile_starred.xml
index 7147f3c..6cdf213 100644
--- a/res/layout/contact_tile_single.xml
+++ b/res/layout/contact_tile_starred.xml
@@ -15,33 +15,27 @@
 -->
 <view
     xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.list.ContactTileView"
-    android:focusable="true"
-    android:background="@drawable/list_selector"
-    android:paddingRight="16dip"
-    android:paddingLeft="16dip" >
+    class="com.android.contacts.list.ContactTileStarredView"
+    style="@style/ContactTileStarred" >
 
-    <LinearLayout
+    <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent" >
 
-        <TextView
-            android:id="@+id/contact_tile_name"
-            android:layout_width="0dip"
-            android:layout_height="fill_parent"
-            android:layout_weight="1"
-            android:textSize="18sp"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:paddingTop="24dip" />
-
         <ImageView
             android:id="@+id/contact_tile_image"
-            android:layout_width="64dip"
-            android:layout_height="64dip"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
             android:scaleType="centerCrop" />
 
-    </LinearLayout>
+        <View
+            android:id="@+id/contact_tile_background"
+            style="@style/ContactTileStarredTextBackground" />
+
+        <TextView
+            android:id="@+id/contact_tile_name"
+            style="@style/ContactTileStarredText" />
+
+    </RelativeLayout>
 
 </view>
diff --git a/res/layout/contact_tile_starred_quick_contact.xml b/res/layout/contact_tile_starred_quick_contact.xml
new file mode 100644
index 0000000..241ab54
--- /dev/null
+++ b/res/layout/contact_tile_starred_quick_contact.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.list.ContactTileStarredView"
+    style="@style/ContactTileStarred" >
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" >
+
+        <QuickContactBadge
+            android:id="@+id/contact_tile_quick"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:scaleType="centerCrop" />
+
+        <View
+            android:id="@+id/contact_tile_background"
+            style="@style/ContactTileStarredTextBackground" />
+
+        <TextView
+            android:id="@+id/contact_tile_name"
+            style="@style/ContactTileStarredText" />
+
+    </RelativeLayout>
+
+</view>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e4b7a86..01f0e62 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -328,4 +328,32 @@
         <item name="android:background">@drawable/btn_dial</item>
         <item name="android:soundEffectsEnabled">false</item>
     </style>
+
+    <style name="ContactTileStarred">
+        <item name="android:focusable">true</item>
+        <item name="android:padding">1px</item>
+        <item name="android:background">@drawable/list_selector</item>
+    </style>
+
+    <style name="ContactTileStarredText">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">48dip</item>
+        <item name="android:layout_alignParentBottom">true</item>
+        <item name="android:layout_alignParentLeft">true</item>
+        <item name="android:gravity">center_vertical</item>
+        <item name="android:paddingLeft">8dip</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:ellipsize">end</item>
+        <item name="android:textColor">@android:color/white</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+    </style>
+
+    <style name="ContactTileStarredTextBackground">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">48dip</item>
+        <item name="android:layout_alignParentBottom">true</item>
+        <item name="android:layout_alignParentLeft">true</item>
+        <item name="android:alpha">0.5</item>
+        <item name="android:background">@android:color/black</item>
+    </style>
 </resources>
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index e345db7..0fa745d 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -333,6 +333,7 @@
             mCallLogFragment.onVisibilityChanged(currentPosition == TAB_INDEX_CALL_LOG);
         } else if (fragment instanceof StrequentContactListFragment) {
             mStrequentFragment = (StrequentContactListFragment) fragment;
+            mStrequentFragment.setQuickContact(false);
             mStrequentFragment.setListener(mStrequentListener);
         } else if (fragment instanceof PhoneNumberPickerFragment) {
             mSearchFragment = (PhoneNumberPickerFragment) fragment;
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index bf0b256..12a17f2 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -236,10 +236,12 @@
         } else if (fragment instanceof GroupDetailFragment) {
             mGroupDetailFragment = (GroupDetailFragment) fragment;
             mGroupDetailFragment.setListener(mGroupDetailFragmentListener);
+            mGroupDetailFragment.setQuickContact(PhoneCapabilityTester.isUsingTwoPanes(this));
         } else if (fragment instanceof StrequentContactListFragment) {
             mFavoritesFragment = (StrequentContactListFragment) fragment;
             mFavoritesFragment.setListener(mFavoritesFragmentListener);
             mFavoritesFragment.setDisplayType(DisplayType.STARRED_ONLY);
+            mFavoritesFragment.setQuickContact(PhoneCapabilityTester.isUsingTwoPanes(this));
         }
     }
 
@@ -488,6 +490,10 @@
                     filter = ContactListFilter.createFilterWithType(
                             ContactListFilter.FILTER_TYPE_STARRED);
                     break;
+                case ContactsRequest.ACTION_VIEW_CONTACT:
+                    if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
+                        getActionBar().setSelectedNavigationItem(TabState.ALL.ordinal());
+                    }
             }
 
             mSearchMode = mRequest.isSearchMode();
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index fe2605e..9e668bb 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -105,6 +105,7 @@
 
         mAdapter = new ContactTileAdapter(activity, mContactTileListener, columnCount,
                 DisplayType.GROUP_MEMBERS);
+
         configurePhotoLoader();
     }
 
@@ -130,6 +131,10 @@
         startGroupMetadataLoader();
     }
 
+    public void setQuickContact(boolean enableQuickContact) {
+        mAdapter.setQuickContact(enableQuickContact);
+    }
+
     private void configureAdapter(long groupId) {
         mGroupId = groupId;
         mMemberListView.setAdapter(mAdapter);
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 5d5e6cb..20c639e 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -65,6 +65,7 @@
     private int mPhotoUriIndex;
     private int mNameIndex;
     private int mStarredIndex;
+    private boolean mIsQuickContact = false;
 
     /**
      * Configures the adapter to filter and display contacts using different view types.
@@ -72,27 +73,23 @@
      */
     public enum DisplayType {
         /**
-         * Displays a mixed view type where Starred Contacts
-         * are in a regular {@link ContactTileView} layout and
-         * frequent contacts are in a small {@link ContactTileView} layout.
+         * Displays a mixed view type of starred and frequent contacts
          */
         STREQUENT,
 
         /**
-         * Display only starred contacts in
-         * regular {@link ContactTileView} layout.
+         * Display only starred contacts
          */
         STARRED_ONLY,
 
         /**
-         * Display only most frequently contacted in a
-         * single {@link ContactTileView} layout.
+         * Display only most frequently contacted
          */
         FREQUENT_ONLY,
 
         /**
-         * Display all contacts from a group in the cursor in a
-         * regular {@link ContactTileView} layout. Use {@link GroupMemberLoader}
+         * Display all contacts from a group in the cursor
+         * Use {@link GroupMemberLoader}
          * when passing {@link Cursor} into loadFromCusor method.
          */
         GROUP_MEMBERS
@@ -120,6 +117,10 @@
         mDisplayType = displayType;
     }
 
+    public void setQuickContact(boolean enableQuickContact) {
+        mIsQuickContact = enableQuickContact;
+    }
+
     /**
      * Sets the column indices for expected {@link Cursor}
      * based on {@link DisplayType}.
@@ -292,7 +293,7 @@
         int columnCount = -1;
 
         switch (itemViewType) {
-            case ViewTypes.SQUARE:
+            case ViewTypes.STARRED:
                 if (contactTileRowView == null) {
                     // Creating new row if needed
                     contactTileRowView = new ContactTileRow(mContext, layoutResId, true);
@@ -300,7 +301,7 @@
                 columnCount = mColumnCount;
                 break;
 
-            case ViewTypes.SINGLE_ROW:
+            case ViewTypes.FREQUENT:
                 if (contactTileRowView == null) {
                     // Creating new row if needed
                     contactTileRowView = new ContactTileRow(mContext, layoutResId, false);
@@ -327,10 +328,14 @@
 
     private int getLayoutResourceId(int viewType) {
         switch (viewType) {
-            case ViewTypes.SQUARE:
-                return R.layout.contact_tile_square;
-            case ViewTypes.SINGLE_ROW:
-                return R.layout.contact_tile_single;
+            case ViewTypes.STARRED:
+                if (mIsQuickContact) {
+                    return R.layout.contact_tile_starred_quick_contact;
+                } else {
+                    return R.layout.contact_tile_starred;
+                }
+            case ViewTypes.FREQUENT:
+                return R.layout.contact_tile_frequent;
             default:
                 throw new IllegalArgumentException("Received unrecognized viewType " + viewType);
         }
@@ -343,8 +348,8 @@
     /**
      * Returns view type based on {@link DisplayType}.
      * {@link DisplayType#STARRED_ONLY} and {@link DisplayType#GROUP_MEMBERS}
-     * are {@link ViewTypes#SQUARE}.
-     * {@link DisplayType#FREQUENT_ONLY} is {@link ViewTypes#SINGLE_ROW}.
+     * are {@link ViewTypes#STARRED}.
+     * {@link DisplayType#FREQUENT_ONLY} is {@link ViewTypes#FREQUENT}.
      * {@link DisplayType#STREQUENT} mixes both {@link ViewTypes}
      * and also adds in {@link ViewTypes#DIVIDER}.
      */
@@ -353,17 +358,17 @@
         switch (mDisplayType) {
             case STREQUENT:
                 if (position < mDividerRowIndex) {
-                    return ViewTypes.SQUARE;
+                    return ViewTypes.STARRED;
                 } else if (position == mDividerRowIndex) {
                     return ViewTypes.DIVIDER;
                 } else {
-                    return ViewTypes.SINGLE_ROW;
+                    return ViewTypes.FREQUENT;
                 }
             case STARRED_ONLY:
             case GROUP_MEMBERS:
-                return ViewTypes.SQUARE;
+                return ViewTypes.STARRED;
             case FREQUENT_ONLY:
-                return ViewTypes.SINGLE_ROW;
+                return ViewTypes.FREQUENT;
             default:
                 throw new IllegalStateException(
                         "Received unrecognized DisplayType " + mDisplayType);
@@ -400,7 +405,7 @@
 
             if (getChildCount() <= tileIndex) {
                 if (mIsContactTileSquare) {
-                    contactTile = (ContactTileSquareView) inflate(mContext, mLayoutResId, null);
+                    contactTile = (ContactTileStarredView) inflate(mContext, mLayoutResId, null);
                 } else {
                     contactTile = (ContactTileView) inflate(mContext, mLayoutResId, null);
                 }
@@ -433,9 +438,9 @@
 
     private static class ViewTypes {
         public static final int COUNT = 3;
-        public static final int SQUARE = 0;
+        public static final int STARRED = 0;
         public static final int DIVIDER = 1;
-        public static final int SINGLE_ROW = 2;
+        public static final int FREQUENT = 2;
     }
 
     public interface Listener {
diff --git a/src/com/android/contacts/list/ContactTileSquareView.java b/src/com/android/contacts/list/ContactTileStarredView.java
similarity index 80%
rename from src/com/android/contacts/list/ContactTileSquareView.java
rename to src/com/android/contacts/list/ContactTileStarredView.java
index 7716481..3c0ba42 100644
--- a/src/com/android/contacts/list/ContactTileSquareView.java
+++ b/src/com/android/contacts/list/ContactTileStarredView.java
@@ -19,13 +19,13 @@
 import android.util.AttributeSet;
 
 /**
- * A ContactTileSquare displays the contact's picture overlayed with their name
+ * A {@link ContactTileStarredView} displays the contact's picture overlayed with their name
  * in a perfect square.
  */
-public class ContactTileSquareView extends ContactTileView {
-    private final static String TAG = ContactTileSquareView.class.getSimpleName();
+public class ContactTileStarredView extends ContactTileView {
+    private final static String TAG = ContactTileStarredView.class.getSimpleName();
 
-    public ContactTileSquareView(Context context, AttributeSet attrs) {
+    public ContactTileStarredView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
diff --git a/src/com/android/contacts/list/ContactTileView.java b/src/com/android/contacts/list/ContactTileView.java
index ad711cf..279dc93 100644
--- a/src/com/android/contacts/list/ContactTileView.java
+++ b/src/com/android/contacts/list/ContactTileView.java
@@ -26,6 +26,7 @@
 import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
+import android.widget.QuickContactBadge;
 import android.widget.TextView;
 
 /**
@@ -36,6 +37,7 @@
 
     private Uri mLookupUri;
     private ImageView mPhoto;
+    private QuickContactBadge mQuickContact;
     private TextView mName;
     private ContactPhotoManager mPhotoManager = null;
 
@@ -47,6 +49,8 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
         mName = (TextView) findViewById(R.id.contact_tile_name);
+
+        mQuickContact = (QuickContactBadge) findViewById(R.id.contact_tile_quick);
         mPhoto = (ImageView) findViewById(R.id.contact_tile_image);
     }
 
@@ -62,11 +66,23 @@
         if (entry != null) {
             mName.setText(entry.name);
             mLookupUri = entry.lookupKey;
-            mPhoto.setImageBitmap(null);
+
+            if (mQuickContact != null) {
+                mQuickContact.assignContactUri(mLookupUri);
+                mQuickContact.setImageBitmap(null);
+            } else {
+                mPhoto.setImageBitmap(null);
+            }
+
             setVisibility(View.VISIBLE);
 
             if (mPhotoManager != null) {
-                mPhotoManager.loadPhoto(mPhoto, entry.photoUri);
+                if (mQuickContact != null){
+                    mPhotoManager.loadPhoto(mQuickContact, entry.photoUri);
+                } else {
+                    mPhotoManager.loadPhoto(mPhoto, entry.photoUri);
+                }
+
             } else {
                 Log.w(TAG, "contactPhotoManager not set");
             }
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 18edaea..00b3072 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -85,6 +85,10 @@
         mAdapter.setDisplayType(displayType);
     }
 
+    public void setQuickContact(boolean enableQuickContact) {
+        mAdapter.setQuickContact(enableQuickContact);
+    }
+
     /**
      * The listener for the strequent meta data loader.
      */