New social item layout. Using spannable.
diff --git a/src/com/android/contacts/SocialStreamActivity.java b/src/com/android/contacts/SocialStreamActivity.java
index 920999b..486ee22 100644
--- a/src/com/android/contacts/SocialStreamActivity.java
+++ b/src/com/android/contacts/SocialStreamActivity.java
@@ -17,12 +17,12 @@
 package com.android.contacts;
 
 import com.android.contacts.EdgeTriggerView.EdgeTriggerListener;
+import com.android.contacts.SocialStreamActivity.MappingCache.Mapping;
 import com.android.providers.contacts2.ContactsContract;
 import com.android.providers.contacts2.ContactsContract.Aggregates;
 import com.android.providers.contacts2.ContactsContract.Contacts;
 import com.android.providers.contacts2.ContactsContract.Data;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Photo;
-import com.android.providers.contacts2.ContactsContract.CommonDataKinds.StructuredName;
 import com.android.providers.contacts2.SocialContract.Activities;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -35,7 +35,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.Cursor;
 import android.graphics.Bitmap;
@@ -43,26 +42,21 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.PaintFlagsDrawFilter;
-import android.graphics.PixelFormat;
 import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.PaintDrawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.text.SpannableStringBuilder;
 import android.text.format.DateUtils;
+import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.BaseAdapter;
 import android.widget.CursorAdapter;
 import android.widget.ImageView;
 import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
 
 import java.io.IOException;
@@ -116,11 +110,7 @@
         mMappingCache = MappingCache.createAndFill(this);
 
         Cursor cursor = managedQuery(Activities.CONTENT_URI, PROJ_ACTIVITIES, null, null);
-        mAdapter = new SocialAdapter(this, cursor, mContactsCache);
-
-//        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor,
-//                new String[] { Activities.AUTHOR_CONTACT_ID, Activities.TITLE },
-//                new int[] { android.R.id.text1, android.R.id.text2 });
+        mAdapter = new SocialAdapter(this, cursor, mContactsCache, mMappingCache);
 
         setListAdapter(mAdapter);
 
@@ -158,42 +148,67 @@
      * {@link Activities#CONTENT_URI}.
      */
     private static class SocialAdapter extends CursorAdapter {
-        private Context mContext;
-        private LayoutInflater mInflater;
-        private ContactsCache mContactsCache;
+        private final Context mContext;
+        private final LayoutInflater mInflater;
+        private final ContactsCache mContactsCache;
+        private final MappingCache mMappingCache;
+        private final TextAppearanceSpan mTextAppearanceName;
+        private final TextAppearanceSpan mTextAppearanceStatus;
 
         private static class SocialHolder {
             ImageView photo;
-            TextView displayname;
-            TextView title;
+            ImageView sourceIcon;
+            TextView content;
+            SpannableStringBuilder contentBuilder = new SpannableStringBuilder();
             TextView published;
         }
 
-        public SocialAdapter(Context context, Cursor c, ContactsCache contactsCache) {
+        public SocialAdapter(Context context, Cursor c, ContactsCache contactsCache,
+                MappingCache mappingCache) {
             super(context, c, true);
             mContext = context;
             mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             mContactsCache = contactsCache;
-        }
+            mMappingCache = mappingCache;
+            mTextAppearanceName =
+                    new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Medium);
+            mTextAppearanceStatus =
+                    new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Small);
+       }
 
         @Override
         public void bindView(View view, Context context, Cursor cursor) {
             SocialHolder holder = (SocialHolder)view.getTag();
 
             long contactId = cursor.getLong(COL_AUTHOR_CONTACT_ID);
+            String name = cursor.getString(COL_DISPLAY_NAME);
+            String title = cursor.getString(COL_TITLE);
+            long published = cursor.getLong(COL_PUBLISHED);
 
             // TODO: trigger async query to find actual name and photo instead
             // of using this lazy caching mechanism
             holder.photo.setImageBitmap(mContactsCache.getPhoto(contactId));
+            holder.contentBuilder.clear();
+            holder.contentBuilder.append(name);
+            holder.contentBuilder.append(": ");
+            holder.contentBuilder.append(title);
+            holder.contentBuilder.setSpan(mTextAppearanceName, 0, name.length() + 2, 0);
+            holder.contentBuilder.setSpan(mTextAppearanceStatus, name.length() + 2,
+                    holder.contentBuilder.length(), 0);
+            holder.content.setText(holder.contentBuilder);
 
-            holder.displayname.setText(cursor.getString(COL_DISPLAY_NAME));
-            holder.title.setText(cursor.getString(COL_TITLE));
-
-            long published = cursor.getLong(COL_PUBLISHED);
-            CharSequence relativePublished = DateUtils.getRelativeTimeSpanString(published, System
-                    .currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
+            CharSequence relativePublished = DateUtils.getRelativeTimeSpanString(published,
+                    System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS);
             holder.published.setText(relativePublished);
 
+            String packageName = cursor.getString(COL_PACKAGE);
+            String mimeType = cursor.getString(COL_MIMETYPE);
+            Mapping mapping = mMappingCache.getMapping(packageName, mimeType);
+            if (mapping != null && mapping.icon != null) {
+                holder.sourceIcon.setImageBitmap(mapping.icon);
+            } else {
+                holder.sourceIcon.setImageDrawable(null);
+            }
         }
 
         @Override
@@ -201,10 +216,10 @@
             View view = mInflater.inflate(R.layout.social_list_item, parent, false);
 
             SocialHolder holder = new SocialHolder();
-            holder.photo = (ImageView)view.findViewById(R.id.photo);
-            holder.displayname = (TextView)view.findViewById(R.id.displayname);
-            holder.title = (TextView)view.findViewById(R.id.title);
-            holder.published = (TextView)view.findViewById(R.id.published);
+            holder.photo = (ImageView) view.findViewById(R.id.photo);
+            holder.sourceIcon = (ImageView) view.findViewById(R.id.sourceIcon);
+            holder.content = (TextView) view.findViewById(R.id.content);
+            holder.published = (TextView) view.findViewById(R.id.published);
             view.setTag(holder);
 
             return view;
@@ -365,8 +380,9 @@
                 final int depth = parser.getDepth();
                 while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
                         && type != XmlPullParser.END_DOCUMENT) {
-                    if (type == XmlPullParser.END_TAG)
+                    if (type == XmlPullParser.END_TAG) {
                         continue;
+                    }
 
                     if (!TAG_MAPPING.equals(parser.getName())) {
                         throw new InflateException("Expected Mapping tag");
@@ -420,7 +436,7 @@
          * The size of the thumbnail is defined by the dimension
          * android.R.dimen.launcher_application_icon_size. This method is not
          * thread-safe and should be invoked on the UI thread only.
-         * 
+         *
          * @param bitmap The bitmap to get a thumbnail of.
          * @param context The application's context.
          * @return A thumbnail for the specified bitmap or the bitmap itself if