Added presence and status to ContactTiles and frequents.

-Added status string: "available, busy, away, etc.."
-Cleaned up XML and refactored styles

Change-Id: I66f45c93502ff01849ace1ede7e694e9dc6165b7
diff --git a/res/layout/contact_tile_frequent.xml b/res/layout/contact_tile_frequent.xml
index 4ba7396..fc9c04c 100644
--- a/res/layout/contact_tile_frequent.xml
+++ b/res/layout/contact_tile_frequent.xml
@@ -21,27 +21,44 @@
     android:paddingRight="16dip"
     android:paddingLeft="16dip" >
 
-    <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" />
-
         <QuickContactBadge
             android:id="@+id/contact_tile_quick"
             android:layout_width="64dip"
             android:layout_height="64dip"
-            android:scaleType="centerCrop" />
+            android:scaleType="centerCrop"
+            android:layout_alignParentRight="true" />
 
-    </LinearLayout>
+        <TextView
+            android:id="@+id/contact_tile_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:layout_toLeftOf="@id/contact_tile_quick" />
+
+        <ImageView
+            android:id="@+id/contact_tile_presence"
+            android:layout_width="16dip"
+            android:layout_height="16dip"
+            android:layout_below="@id/contact_tile_name"
+            android:layout_alignParentLeft="true" />
+
+        <TextView
+            android:id="@+id/contact_tile_status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:ellipsize="end"
+            android:singleLine="true"
+            android:textColor="#cccccc"
+            android:layout_toRightOf="@id/contact_tile_presence"
+            android:layout_below="@id/contact_tile_name" />
+
+    </RelativeLayout>
 
 </view>
diff --git a/res/layout/contact_tile_starred.xml b/res/layout/contact_tile_starred.xml
index 6cdf213..ba1dff2 100644
--- a/res/layout/contact_tile_starred.xml
+++ b/res/layout/contact_tile_starred.xml
@@ -30,11 +30,36 @@
 
         <View
             android:id="@+id/contact_tile_background"
-            style="@style/ContactTileStarredTextBackground" />
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/contact_tile_shadowbox_height"
+            android:layout_alignParentBottom="true"
+            style="@style/ContactTileStarredShadowBox" />
+
+        <ImageView
+            android:id="@+id/contact_tile_presence"
+            android:layout_width="16dip"
+            android:layout_height="16dip"
+            android:layout_alignParentBottom="true"
+            android:layout_marginLeft="8dip"
+            android:layout_marginBottom="10dip" />
 
         <TextView
             android:id="@+id/contact_tile_name"
-            style="@style/ContactTileStarredText" />
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@id/contact_tile_presence"
+            android:layout_above="@id/contact_tile_presence"
+            android:textColor="@android:color/white"
+            stlye="@style/ContactTileStarredName" />
+
+        <TextView
+            android:id="@+id/contact_tile_status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_toRightOf="@id/contact_tile_presence"
+            android:layout_below="@id/contact_tile_name"
+            android:layout_marginLeft="4dip"
+            style="@style/ContactTileStatusText" />
 
     </RelativeLayout>
 
diff --git a/res/layout/contact_tile_starred_quick_contact.xml b/res/layout/contact_tile_starred_quick_contact.xml
index 241ab54..0fb580e 100644
--- a/res/layout/contact_tile_starred_quick_contact.xml
+++ b/res/layout/contact_tile_starred_quick_contact.xml
@@ -30,11 +30,36 @@
 
         <View
             android:id="@+id/contact_tile_background"
-            style="@style/ContactTileStarredTextBackground" />
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/contact_tile_shadowbox_height"
+            android:layout_alignParentBottom="true"
+            style="@style/ContactTileStarredShadowBox" />
+
+        <ImageView
+            android:id="@+id/contact_tile_presence"
+            android:layout_width="16dip"
+            android:layout_height="16dip"
+            android:layout_alignParentBottom="true"
+            android:layout_marginLeft="8dip"
+            android:layout_marginBottom="10dip" />
 
         <TextView
             android:id="@+id/contact_tile_name"
-            style="@style/ContactTileStarredText" />
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@id/contact_tile_presence"
+            android:layout_above="@id/contact_tile_presence"
+            android:textColor="@android:color/white"
+            stlye="@style/ContactTileStarredName" />
+
+        <TextView
+            android:id="@+id/contact_tile_status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_toRightOf="@id/contact_tile_presence"
+            android:layout_below="@id/contact_tile_name"
+            android:layout_marginLeft="4dip"
+            style="@style/ContactTileStatusText" />
 
     </RelativeLayout>
 
diff --git a/res/layout/contact_tile_starred_secondary_target.xml b/res/layout/contact_tile_starred_secondary_target.xml
index a8ae00f..5d4e55e 100644
--- a/res/layout/contact_tile_starred_secondary_target.xml
+++ b/res/layout/contact_tile_starred_secondary_target.xml
@@ -30,24 +30,32 @@
 
         <View
             android:id="@+id/contact_tile_background"
-            style="@style/ContactTileStarredTextBackground" />
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/contact_tile_shadowbox_height"
+            android:layout_alignParentBottom="true"
+            style="@style/ContactTileStarredShadowBox" />
 
         <LinearLayout
-            android:orientation="horizontal"
-            style="@style/ContactTileStarredText">
+            android:layout_width="match_parent"
+            android:layout_height="48dip"
+            android:layout_alignParentBottom="true"
+            android:orientation="horizontal" >
 
             <TextView
                 android:id="@+id/contact_tile_name"
-                style="@style/ContactTileStarredText"
                 android:layout_width="0dip"
-                android:layout_weight="2" />
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_vertical"
+                android:layout_marginLeft="8dip"
+                android:textColor="@android:color/white"
+                stlye="@style/ContactTileStarredName" />
 
             <ImageButton
                 android:id="@+id/contact_tile_secondary_button"
                 android:src="@drawable/ic_tab_unselected_contacts"
                 android:layout_height="match_parent"
-                android:layout_width="0dip"
-                android:layout_weight="1" />
+                android:layout_width="wrap_content" />
 
         </LinearLayout>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index b79bf0f..e155cbc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -211,4 +211,7 @@
     <dimen name="contact_browser_list_left_margin">24dip</dimen>
     <dimen name="contact_browser_list_top_margin">8dip</dimen>
     <dimen name="contacts_count_right_margin">40dip</dimen>
+
+    <!--  ContactTile Layouts -->
+    <dimen name="contact_tile_shadowbox_height">48dip</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cf4fff8..75e3249 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1650,4 +1650,14 @@
 
     <!-- Menu item used to show only voicemails in the call log. [CHAR LIMIT=30] -->
     <string name="menu_show_voicemails_only">Show voicemails only</string>
+
+    <!--  Used to display as default status when the contact is available for chat [CHAR LIMIT=19] -->
+    <string name="status_available">Available</string>
+
+    <!--  Used to display as default status when the contact is away or idle for chat [CHAR LIMIT=19] -->
+    <string name="status_away">Away</string>
+
+    <!--  Used to display as default status when the contact is busy or Do not disturb for chat [CHAR LIMIT=19] -->
+    <string name="status_busy">Busy</string>
+
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e4b7525..d16590e 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -360,24 +360,20 @@
         <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>
+    <style name="ContactTileStarredName">
         <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>
+        <item name="android:textSize">16sp</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>
+    <style name="ContactTileStatusText">
+        <item name="android:singleLine">true</item>
+        <item name="android:ellipsize">end</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+        <item name="android:textColor">#777777</item>
+    </style>
+
+    <style name="ContactTileStarredShadowBox">
         <item name="android:alpha">0.5</item>
         <item name="android:background">@android:color/black</item>
     </style>
diff --git a/src/com/android/contacts/ContactTileLoaderFactory.java b/src/com/android/contacts/ContactTileLoaderFactory.java
index 20ad26e..e90730a 100644
--- a/src/com/android/contacts/ContactTileLoaderFactory.java
+++ b/src/com/android/contacts/ContactTileLoaderFactory.java
@@ -33,13 +33,17 @@
     public final static int STARRED = 2;
     public final static int PHOTO_URI = 3;
     public final static int LOOKUP_KEY = 4;
+    public final static int CONTACT_PRESENCE = 5;
+    public final static int CONTACT_STATUS = 6;
 
     private static final String[] COLUMNS = new String[] {
         Contacts._ID,
         Contacts.DISPLAY_NAME,
         Contacts.STARRED,
         Contacts.PHOTO_URI,
-        Contacts.LOOKUP_KEY
+        Contacts.LOOKUP_KEY,
+        Contacts.CONTACT_PRESENCE,
+        Contacts.CONTACT_STATUS,
     };
 
     public static CursorLoader createStrequentLoader(Context context) {
diff --git a/src/com/android/contacts/GroupMemberLoader.java b/src/com/android/contacts/GroupMemberLoader.java
index 452c5d0..9605747 100644
--- a/src/com/android/contacts/GroupMemberLoader.java
+++ b/src/com/android/contacts/GroupMemberLoader.java
@@ -53,6 +53,7 @@
         Data.LOOKUP_KEY,                        // 11
         Data.PHONETIC_NAME,                     // 12
         Data.HAS_PHONE_NUMBER,                  // 13
+        Data.CONTACT_STATUS,                    // 14
     };
 
     private final long mGroupId;
@@ -71,6 +72,7 @@
     public static final int CONTACT_LOOKUP_KEY_COLUMN_INDEX = 11;
     public static final int CONTACT_PHONETIC_NAME_COLUMN_INDEX = 12;
     public static final int CONTACT_HAS_PHONE_COLUMN_INDEX = 13;
+    public static final int CONTACT_STATUS_COLUMN_INDEX = 14;
 
     public GroupMemberLoader(Context context, long groupId) {
         super(context);
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 9674960..48a9938 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -59,6 +59,8 @@
     private int mPhotoUriIndex;
     private int mNameIndex;
     private int mStarredIndex;
+    private int mPresenceIndex;
+    private int mStatusIndex;
 
     private boolean mIsQuickContactEnabled = false;
 
@@ -139,12 +141,16 @@
             mPhotoUriIndex = GroupMemberLoader.CONTACT_PHOTO_URI_COLUMN_INDEX;
             mNameIndex = GroupMemberLoader.CONTACT_DISPLAY_NAME_PRIMARY_COLUMN_INDEX;
             mStarredIndex = GroupMemberLoader.CONTACT_STARRED_COLUMN_INDEX;
+            mPresenceIndex = GroupMemberLoader.CONTACT_PRESENCE_STATUS_COLUMN_INDEX;
+            mStatusIndex = GroupMemberLoader.CONTACT_STATUS_COLUMN_INDEX;
         } else {
             mIdIndex = ContactTileLoaderFactory.CONTACT_ID;
             mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
             mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
             mNameIndex = ContactTileLoaderFactory.DISPLAY_NAME;
             mStarredIndex = ContactTileLoaderFactory.STARRED;
+            mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
+            mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
         }
     }
 
@@ -192,9 +198,11 @@
 
         ContactEntry contact = new ContactEntry();
         contact.name = cursor.getString(mNameIndex);
+        contact.status = cursor.getString(mStatusIndex);
         contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
         contact.lookupKey = ContentUris.withAppendedId(
                 Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), id);
+        contact.presence = cursor.isNull(mPresenceIndex) ? null : cursor.getInt(mPresenceIndex);
 
         return contact;
     }
@@ -455,9 +463,11 @@
      * Class to hold contact information
      */
     public static class ContactEntry {
-        public Uri photoUri;
         public String name;
+        public String status;
+        public Uri photoUri;
         public Uri lookupKey;
+        public Integer presence;
     }
 
     private static class ViewTypes {
diff --git a/src/com/android/contacts/list/ContactTileView.java b/src/com/android/contacts/list/ContactTileView.java
index 7981bd1..715c331 100644
--- a/src/com/android/contacts/list/ContactTileView.java
+++ b/src/com/android/contacts/list/ContactTileView.java
@@ -20,6 +20,8 @@
 import com.android.contacts.list.ContactTileAdapter.ContactEntry;
 
 import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -29,6 +31,9 @@
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
 
+import android.provider.ContactsContract.StatusUpdates;
+
+
 /**
  * A ContactTile displays the contact's picture overlayed with their name
  */
@@ -37,8 +42,10 @@
 
     private Uri mLookupUri;
     private ImageView mPhoto;
+    private ImageView mPresence;
     private QuickContactBadge mQuickContact;
     private TextView mName;
+    private TextView mStatus;
     private ContactPhotoManager mPhotoManager = null;
 
     public ContactTileView(Context context, AttributeSet attrs) {
@@ -53,6 +60,8 @@
 
         mQuickContact = (QuickContactBadge) findViewById(R.id.contact_tile_quick);
         mPhoto = (ImageView) findViewById(R.id.contact_tile_image);
+        mPresence = (ImageView) findViewById(R.id.contact_tile_presence);
+        mStatus = (TextView) findViewById(R.id.contact_tile_status);
     }
 
     public void setPhotoManager(ContactPhotoManager photoManager) {
@@ -68,6 +77,24 @@
             mName.setText(entry.name);
             mLookupUri = entry.lookupKey;
 
+            int presenceDrawableResId = (entry.presence == null ? 0 :
+                    StatusUpdates.getPresenceIconResourceId(entry.presence));
+
+            if (mPresence != null) {
+                mPresence.setBackgroundResource(presenceDrawableResId);
+            }
+
+            if (mStatus != null) {
+                String statusText;
+                if (entry.presence == null) {
+                    statusText = null;
+                } else {
+                    statusText =
+                          (entry.status == null ? getStatusString(entry.presence) : entry.status);
+                }
+                mStatus.setText(statusText);
+            }
+
             if (mQuickContact != null) {
                 mQuickContact.assignContactUri(mLookupUri);
                 mQuickContact.setImageBitmap(null);
@@ -92,6 +119,23 @@
         }
     }
 
+    private String getStatusString(int presence) {
+        Resources resources = getResources();
+        switch (presence) {
+            case StatusUpdates.AVAILABLE:
+                return resources.getString(R.string.status_available);
+            case StatusUpdates.IDLE:
+            case StatusUpdates.AWAY:
+                return resources.getString(R.string.status_away);
+            case StatusUpdates.DO_NOT_DISTURB:
+                return resources.getString(R.string.status_busy);
+            case StatusUpdates.OFFLINE:
+            case StatusUpdates.INVISIBLE:
+            default:
+                return null;
+        }
+    }
+
     public Uri getLookupUri() {
         return mLookupUri;
     }