Added text name and photo to fast-track dialog.
diff --git a/src/com/android/contacts/FastTrackWindow.java b/src/com/android/contacts/FastTrackWindow.java
index 4b7bbd8..0cf9daf 100644
--- a/src/com/android/contacts/FastTrackWindow.java
+++ b/src/com/android/contacts/FastTrackWindow.java
@@ -21,11 +21,13 @@
 import com.android.contacts.SocialStreamActivity.MappingCache;
 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.CommonDataKinds;
 import com.android.providers.contacts2.ContactsContract.Data;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Email;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Im;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Phone;
+import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Photo;
 import com.android.providers.contacts2.ContactsContract.CommonDataKinds.Postal;
 
 import android.content.ActivityNotFoundException;
@@ -34,6 +36,8 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.util.Log;
 import android.view.Gravity;
@@ -82,6 +86,7 @@
 
     private boolean mShowing = false;
     private boolean mHasPosition = false;
+    private boolean mHasDisplayName = false;
     private boolean mHasData = false;
 
     public static final int ICON_SIZE = 42;
@@ -91,7 +96,8 @@
     private int mFirstX;
     private int mFirstY;
 
-    private static final int TOKEN = 1;
+    private static final int TOKEN_DISPLAY_NAME = 1;
+    private static final int TOKEN_DATA = 2;
 
     private static final int GRAVITY = Gravity.LEFT | Gravity.TOP;
 
@@ -152,8 +158,10 @@
         mDataUri = Uri.withAppendedPath(aggUri, ContactsContract.Aggregates.Data.CONTENT_DIRECTORY);
 
         mHandler = new NotifyingAsyncQueryHandler(context, this);
-        mHandler.startQuery(TOKEN, null, mDataUri, null, null, null, null);
+        mHandler.startQuery(TOKEN_DISPLAY_NAME, null, aggUri, null, null, null, null);
+        mHandler.startQuery(TOKEN_DATA, null, mDataUri, null, null, null, null);
 
+        // TODO: poll around for latest status message or location details
     }
 
     /**
@@ -161,7 +169,7 @@
      * completed query results.
      */
     private synchronized void considerShowing() {
-        if (mHasData && mHasPosition && !mShowing) {
+        if (mHasData && mHasPosition && mHasDisplayName && !mShowing) {
             mShowing = true;
             showAtLocation(mParent, GRAVITY, mFirstX, mFirstY);
         }
@@ -185,6 +193,40 @@
 
     /** {@inheritDoc} */
     public void onQueryComplete(int token, Object cookie, Cursor cursor) {
+        if (cursor == null) {
+            return;
+        }
+        switch (token) {
+            case TOKEN_DISPLAY_NAME:
+                handleDisplayName(cursor);
+                break;
+            case TOKEN_DATA:
+                handleData(cursor);
+                break;
+        }
+        considerShowing();
+    }
+
+    /**
+     * Handle the result from the {@link TOKEN_DISPLAY_NAME} query.
+     */
+    private void handleDisplayName(Cursor cursor) {
+        final TextView displayname = (TextView)mContent.findViewById(R.id.displayname);
+        final int COL_DISPLAY_NAME = cursor.getColumnIndex(Aggregates.DISPLAY_NAME);
+
+        if (cursor.moveToNext()) {
+            String foundName = cursor.getString(COL_DISPLAY_NAME);
+            displayname.setText(foundName);
+        }
+
+        mHasDisplayName = true;
+    }
+
+    /**
+     * Handle the result from the {@link TOKEN_DATA} query.
+     */
+    private void handleData(Cursor cursor) {
+        final ImageView photo = (ImageView)mContent.findViewById(R.id.photo);
         final ViewGroup fastTrack = (ViewGroup)mContent.findViewById(R.id.fasttrack);
 
         // Build list of actions for this contact, this could be done better in
@@ -194,12 +236,25 @@
         final int COL_ID = cursor.getColumnIndex(Data._ID);
         final int COL_PACKAGE = cursor.getColumnIndex(Data.PACKAGE);
         final int COL_MIMETYPE = cursor.getColumnIndex(Data.MIMETYPE);
+        final int COL_PHOTO = cursor.getColumnIndex(Photo.PHOTO);
+
+        boolean foundDisplayName = false;
+        boolean foundPhoto = false;
 
         while (cursor.moveToNext()) {
             final long dataId = cursor.getLong(COL_ID);
             final String packageName = cursor.getString(COL_PACKAGE);
             final String mimeType = cursor.getString(COL_MIMETYPE);
 
+            // Handle finding the photo among various return rows
+            if (!foundPhoto && Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                byte[] photoBlob = cursor.getBlob(COL_PHOTO);
+                Bitmap photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
+                photo.setImageBitmap(photoBitmap);
+                photo.setVisibility(View.VISIBLE);
+                foundPhoto = true;
+            }
+
             ImageView action;
 
             // First, try looking in mapping cache for possible icon match
@@ -262,7 +317,6 @@
         }
 
         mHasData = true;
-        considerShowing();
     }
 
     /**