Fix NullPointerException in DetailViewEntry.toString()

NullPointerException can happen in multiple places such as uri.toString().
uri may be null.

Change-Id: I75e18ef40b994cfdafacf0d081aab558aebe744b
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index f836139..2647ad6 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -69,7 +69,6 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import com.android.contacts.common.ContactPresenceIconUtil;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.GroupMetaData;
@@ -80,21 +79,23 @@
 import com.android.contacts.common.ClipboardUtils;
 import com.android.contacts.common.Collapser;
 import com.android.contacts.common.Collapser.Collapsible;
+import com.android.contacts.common.ContactPresenceIconUtil;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.MoreContactUtils;
 import com.android.contacts.common.editor.SelectAccountDialogFragment;
 import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.model.Contact;
-import com.android.contacts.model.RawContact;
-import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.model.RawContactDeltaList;
-import com.android.contacts.model.RawContactModifier;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountType.EditType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.model.dataitem.DataItem;
 import com.android.contacts.common.model.dataitem.DataKind;
+import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
+import com.android.contacts.model.Contact;
+import com.android.contacts.model.RawContact;
+import com.android.contacts.model.RawContactDelta;
+import com.android.contacts.model.RawContactDeltaList;
+import com.android.contacts.model.RawContactModifier;
+import com.android.contacts.model.dataitem.DataItem;
 import com.android.contacts.model.dataitem.EmailDataItem;
 import com.android.contacts.model.dataitem.EventDataItem;
 import com.android.contacts.model.dataitem.GroupMembershipDataItem;
@@ -108,7 +109,6 @@
 import com.android.contacts.model.dataitem.StructuredNameDataItem;
 import com.android.contacts.model.dataitem.StructuredPostalDataItem;
 import com.android.contacts.model.dataitem.WebsiteDataItem;
-import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.util.DataStatus;
 import com.android.contacts.util.DateUtils;
 import com.android.contacts.util.PhoneCapabilityTester;
@@ -116,6 +116,7 @@
 import com.android.contacts.util.UiClosables;
 import com.android.internal.telephony.ITelephony;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
 import com.google.common.collect.Iterables;
 
 import java.util.ArrayList;
@@ -1234,34 +1235,26 @@
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append("== DetailViewEntry ==\n");
-            sb.append("  type: " + type + "\n");
-            sb.append("  kind: " + kind + "\n");
-            sb.append("  typeString: " + typeString + "\n");
-            sb.append("  data: " + data + "\n");
-            sb.append("  uri: " + uri.toString() + "\n");
-            sb.append("  maxLines: " + maxLines + "\n");
-            sb.append("  mimetype: " + mimetype + "\n");
-            sb.append("  isPrimary: " + (isPrimary ? "true" : "false") + "\n");
-            sb.append("  secondaryActionIcon: " + secondaryActionIcon + "\n");
-            sb.append("  secondaryActionDescription: " + secondaryActionDescription + "\n");
-            if (intent == null) {
-                sb.append("  intent: " + intent.toString() + "\n");
-            } else {
-                sb.append("  intent: " + intent.toString() + "\n");
-            }
-            if (secondaryIntent == null) {
-                sb.append("  secondaryIntent: (null)\n");
-            } else {
-                sb.append("  secondaryIntent: " + secondaryIntent.toString() + "\n");
-            }
-            sb.append("  ids: " + Iterables.toString(ids) + "\n");
-            sb.append("  collapseCount: " + collapseCount + "\n");
-            sb.append("  presence: " + presence + "\n");
-            sb.append("  chatCapability: " + chatCapability + "\n");
-            sb.append("  mIsInSubsection: " + (mIsInSubSection ? "true" : "false") + "\n");
-            return sb.toString();
+            return Objects.toStringHelper(this)
+                    .add("type", type)
+                    .add("kind", kind)
+                    .add("typeString", typeString)
+                    .add("data", data)
+                    .add("uri", uri)
+                    .add("maxLines", maxLines)
+                    .add("mimetype", mimetype)
+                    .add("context", context)
+                    .add("isPrimary", isPrimary)
+                    .add("secondaryActionIcon", secondaryActionIcon)
+                    .add("secondaryActionDescription", secondaryActionDescription)
+                    .add("intent", intent)
+                    .add("secondaryIntent", secondaryIntent)
+                    .add("ids", ids)
+                    .add("collapseCount", collapseCount)
+                    .add("presence", presence)
+                    .add("chatCapability", chatCapability)
+                    .add("mIsInSubSection", mIsInSubSection)
+                    .toString();
         }
 
         DetailViewEntry() {