diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index 0931e3d..f3f7073 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.contacts;
 
-import com.android.contacts.format.FormatUtils;
 import com.android.internal.telephony.CallerInfo;
 
 import android.app.ListActivity;
@@ -26,18 +25,15 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.Typeface;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.provider.Contacts.Intents.Insert;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.PhoneLookup;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
-import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.view.KeyEvent;
@@ -60,9 +56,8 @@
         AdapterView.OnItemClickListener {
     private static final String TAG = "CallDetail";
 
-    private TextView mNameView;
-    private TextView mCallTypeView;
-    private TextView mNumberView;
+    /** The views representing the details of a phone call. */
+    PhoneCallDetailsViews mPhoneCallDetailsViews;
     private TextView mCallTimeView;
     private TextView mCallDurationView;
     private View mCallActionView;
@@ -118,9 +113,7 @@
         mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
         mResources = getResources();
 
-        mNameView = (TextView) findViewById(R.id.name);
-        mCallTypeView = (TextView) findViewById(R.id.call_type);
-        mNumberView = (TextView) findViewById(R.id.number);
+        mPhoneCallDetailsViews = new PhoneCallDetailsViews(getWindow().getDecorView());
         mCallActionView = findViewById(R.id.call);
         mContactPhotoView = (ImageView) findViewById(R.id.contact_photo);
         mContactBackgroundView = (ImageView) findViewById(R.id.contact_background);
@@ -189,46 +182,18 @@
                     mCallDurationView.setText(formatDuration(duration));
                 }
 
-                CharSequence shortDateText =
-                        DateUtils.getRelativeTimeSpanString(date,
-                                System.currentTimeMillis(),
-                                DateUtils.MINUTE_IN_MILLIS,
-                                DateUtils.FORMAT_ABBREV_RELATIVE);
-
-                CharSequence callTypeText = "";
-                switch (callType) {
-                    case Calls.INCOMING_TYPE:
-                        callTypeText = getString(R.string.type_incoming);
-                        break;
-
-                    case Calls.OUTGOING_TYPE:
-                        callTypeText = getString(R.string.type_outgoing);
-                        break;
-
-                    case Calls.MISSED_TYPE:
-                        callTypeText = getString(R.string.type_missed);
-                        break;
-                }
-
-                mCallTypeView.setText(
-                        getString(R.string.call_type_and_date,
-                                FormatUtils.applyStyleToSpan(Typeface.BOLD,
-                                        callTypeText, 0, callTypeText.length(),
-                                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE),
-                                shortDateText));
-
                 long photoId = 0L;
                 CharSequence nameText = "";
-                CharSequence numberText = "";
+                final CharSequence numberText;
+                int numberType = 0;
+                CharSequence numberLabel = "";
                 if (mNumber.equals(CallerInfo.UNKNOWN_NUMBER) ||
                         mNumber.equals(CallerInfo.PRIVATE_NUMBER)) {
-                    nameText = getString(mNumber.equals(CallerInfo.PRIVATE_NUMBER)
+                    numberText = getString(mNumber.equals(CallerInfo.PRIVATE_NUMBER)
                             ? R.string.private_num : R.string.unknown);
-                    numberText = "";
                     mCallActionView.setVisibility(View.GONE);
                 } else {
                     // Perform a reverse-phonebook lookup to find the PERSON_ID
-                    CharSequence callLabel = null;
                     Uri personUri = null;
                     Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                             Uri.encode(mNumber));
@@ -245,15 +210,15 @@
                                     phonesCursor.getString(COLUMN_INDEX_NUMBER),
                                     phonesCursor.getString(COLUMN_INDEX_NORMALIZED_NUMBER),
                                     countryIso);
-                            callLabel = Phone.getTypeLabel(getResources(),
-                                    phonesCursor.getInt(COLUMN_INDEX_TYPE),
-                                    phonesCursor.getString(COLUMN_INDEX_LABEL));
+                            numberType = phonesCursor.getInt(COLUMN_INDEX_TYPE);
+                            numberLabel = phonesCursor.getString(COLUMN_INDEX_LABEL);
                         } else {
                             mNumber = PhoneNumberUtils.formatNumber(mNumber, countryIso);
                         }
                     } finally {
                       if (phonesCursor != null) phonesCursor.close();
                     }
+                    numberText = mNumber;
 
                     mCallActionView.setVisibility(View.VISIBLE);
                     mCallActionView.setOnClickListener(new View.OnClickListener() {
@@ -265,15 +230,6 @@
                         }
                     });
 
-                    if (callLabel != null) {
-                        numberText = FormatUtils.applyStyleToSpan(Typeface.BOLD,
-                                callLabel + " " + mNumber, 0,
-                                callLabel.length(),
-                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-                    } else {
-                        numberText = mNumber;
-                    }
-
                     // Build list of various available actions
                     List<ViewEntry> actions = new ArrayList<ViewEntry>();
 
@@ -299,8 +255,8 @@
                     ViewAdapter adapter = new ViewAdapter(this, actions);
                     setListAdapter(adapter);
                 }
-                mNameView.setText(nameText);
-                mNumberView.setText(numberText);
+                mPhoneCallDetailsViews.setPhoneCallDetails(getResources(), date, callType, nameText,
+                        numberText, numberType, numberLabel);
 
                 loadContactPhotos(photoId);
             } else {
diff --git a/src/com/android/contacts/PhoneCallDetailsViews.java b/src/com/android/contacts/PhoneCallDetailsViews.java
new file mode 100644
index 0000000..713a667
--- /dev/null
+++ b/src/com/android/contacts/PhoneCallDetailsViews.java
@@ -0,0 +1,124 @@
+/*
+ * 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.
+ */
+
+package com.android.contacts;
+
+import com.android.contacts.format.FormatUtils;
+
+import android.content.res.Resources;
+import android.graphics.Typeface;
+import android.provider.CallLog.Calls;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.telephony.PhoneNumberUtils;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Encapsulates the views that are used to display the details of a phone call in the call log.
+ */
+public final class PhoneCallDetailsViews {
+    public final TextView mNameView;
+    public final TextView mCallTypeAndDateView;
+    public final TextView mNumberView;
+
+    /**
+     * Creates a new instance and caches its views.
+     *
+     * @param view the view which contains the elements to fill
+     */
+    public PhoneCallDetailsViews(View view) {
+        mNameView = (TextView) view.findViewById(R.id.name);
+        mCallTypeAndDateView = (TextView) view.findViewById(R.id.call_type);
+        mNumberView = (TextView) view.findViewById(R.id.number);
+    }
+
+    /**
+     * Fills the call details views with content.
+     *
+     * @param resources used to look up strings
+     * @param date the date of the call, in milliseconds since the epoch
+     * @param callType the type of call, as defined in the call log table
+     * @param name the name of the contact, if available
+     * @param number the number of the other party involved in the call
+     * @param numberType the type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available
+     * @param numberLabel the custom label associated with the phone number in the contact
+     */
+    public void setPhoneCallDetails(Resources resources, long date, int callType,
+            CharSequence name, CharSequence number, int numberType, CharSequence numberLabel) {
+        CharSequence callTypeText = "";
+        switch (callType) {
+            case Calls.INCOMING_TYPE:
+                callTypeText = resources.getString(R.string.type_incoming);
+                break;
+
+            case Calls.OUTGOING_TYPE:
+                callTypeText = resources.getString(R.string.type_outgoing);
+                break;
+
+            case Calls.MISSED_TYPE:
+                callTypeText = resources.getString(R.string.type_missed);
+                break;
+        }
+
+        CharSequence shortDateText =
+            DateUtils.getRelativeTimeSpanString(date,
+                    System.currentTimeMillis(),
+                    DateUtils.MINUTE_IN_MILLIS,
+                    DateUtils.FORMAT_ABBREV_RELATIVE);
+
+        CharSequence callTypeAndDateText = FormatUtils.applyStyleToSpan(Typeface.BOLD,
+                callTypeText + " " + shortDateText, 0, callTypeText.length(),
+                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        CharSequence numberFormattedLabel = null;
+        // Only show a label if the number is shown and it is not a SIP address.
+        if (!TextUtils.isEmpty(number) && !PhoneNumberUtils.isUriNumber(number.toString())) {
+            numberFormattedLabel = Phone.getTypeLabel(resources, numberType, numberLabel);
+        }
+
+        CharSequence nameText;
+        CharSequence numberText;
+        if (TextUtils.isEmpty(name)) {
+            nameText = number;
+            numberText = "";
+        } else {
+            nameText = name;
+            numberText = number;
+            if (callType != 0 && numberFormattedLabel != null) {
+                numberText = FormatUtils.applyStyleToSpan(Typeface.BOLD,
+                        numberFormattedLabel + " " + number, 0,
+                        numberFormattedLabel.length(),
+                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+            }
+        }
+
+        mCallTypeAndDateView.setText(callTypeAndDateText);
+        mCallTypeAndDateView.setVisibility(View.VISIBLE);
+        mNameView.setText(nameText);
+        mNameView.setVisibility(View.VISIBLE);
+        // Do not show the number if it is not available. This happens if we have only the number,
+        // in which case the number is shown in the name field instead.
+        if (!TextUtils.isEmpty(numberText)) {
+            mNumberView.setText(numberText);
+            mNumberView.setVisibility(View.VISIBLE);
+        } else {
+            mNumberView.setVisibility(View.GONE);
+        }
+    }
+}
\ No newline at end of file
