Merge "Import translations. DO NOT MERGE" into lmp-dev
diff --git a/res/drawable-hdpi/ic_directions_24dp.png b/res/drawable-hdpi/ic_directions_24dp.png
new file mode 100644
index 0000000..c378972
--- /dev/null
+++ b/res/drawable-hdpi/ic_directions_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_list_default_mime_holo_dark.png b/res/drawable-hdpi/ic_list_default_mime_holo_dark.png
deleted file mode 100644
index 4dc1c39..0000000
--- a/res/drawable-hdpi/ic_list_default_mime_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_directions_24dp.png b/res/drawable-mdpi/ic_directions_24dp.png
new file mode 100644
index 0000000..bd171d2
--- /dev/null
+++ b/res/drawable-mdpi/ic_directions_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_default_mime_holo_dark.png b/res/drawable-mdpi/ic_list_default_mime_holo_dark.png
deleted file mode 100644
index d950b31..0000000
--- a/res/drawable-mdpi/ic_list_default_mime_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_directions_24dp.png b/res/drawable-xhdpi/ic_directions_24dp.png
new file mode 100644
index 0000000..99cde4a
--- /dev/null
+++ b/res/drawable-xhdpi/ic_directions_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_default_mime_holo_dark.png b/res/drawable-xhdpi/ic_list_default_mime_holo_dark.png
deleted file mode 100644
index 73cddd1..0000000
--- a/res/drawable-xhdpi/ic_list_default_mime_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_directions_24dp.png b/res/drawable-xxhdpi/ic_directions_24dp.png
new file mode 100644
index 0000000..e0d53a3
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_directions_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_list_default_mime_holo_dark.png b/res/drawable-xxhdpi/ic_list_default_mime_holo_dark.png
deleted file mode 100644
index 4f12d95..0000000
--- a/res/drawable-xxhdpi/ic_list_default_mime_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_directions_24dp.png b/res/drawable-xxxhdpi/ic_directions_24dp.png
new file mode 100644
index 0000000..b7e3377
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_directions_24dp.png
Binary files differ
diff --git a/res/layout-land/contact_detail_fragment.xml b/res/layout-land/contact_detail_fragment.xml
deleted file mode 100644
index 2d788df..0000000
--- a/res/layout-land/contact_detail_fragment.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_alignParentRight="true"
-        android:layout_alignParentEnd="true"
-        android:layout_alignParentBottom="true"
-        android:layout_marginRight="40dip"
-        android:layout_marginEnd="40dip"
-        android:layout_marginTop="20dip"
-        android:layout_marginBottom="20dip" />
-
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_width="match_parent"
-        android:layout_above="@id/contact_quick_fix"
-        android:layout_height="match_parent"
-        android:baselineAligned="false"
-        android:background="@android:color/white">
-
-        <include android:id="@+id/static_photo_container"
-            layout="@layout/photo_selector_view"
-            android:layout_width="@dimen/detail_contact_photo_size"
-            android:layout_height="@dimen/detail_contact_photo_size"
-            android:layout_marginLeft="@dimen/detail_contact_photo_margin"
-            android:layout_marginStart="@dimen/detail_contact_photo_margin"
-            android:layout_marginTop="@dimen/detail_contact_photo_margin" />
-
-        <ListView android:id="@android:id/list"
-            android:layout_width="0dip"
-            android:layout_height="match_parent"
-            android:fadingEdge="none"
-            android:layout_weight="1"
-            android:divider="@null"/>
-
-    </LinearLayout>
-
-    <ScrollView android:id="@android:id/empty"
-        android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:fadingEdge="none"
-        android:visibility="gone">
-        <TextView android:id="@+id/emptyText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/no_contact_details"
-            android:textSize="20sp"
-            android:textColor="?android:attr/textColorSecondary"
-            android:paddingLeft="10dip"
-            android:paddingRight="10dip"
-            android:paddingStart="10dip"
-            android:paddingEnd="10dip"
-            android:paddingTop="10dip"
-            android:lineSpacingMultiplier="0.92"/>
-    </ScrollView>
-
-</RelativeLayout>
-
diff --git a/res/layout-land/detail_header_contact_with_updates.xml b/res/layout-land/detail_header_contact_with_updates.xml
deleted file mode 100644
index 588957e..0000000
--- a/res/layout-land/detail_header_contact_with_updates.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact has social updates.
-  This is empty because all the information will be displayed elsewhere.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="0dip"/>
\ No newline at end of file
diff --git a/res/layout-land/detail_header_contact_without_updates.xml b/res/layout-land/detail_header_contact_without_updates.xml
deleted file mode 100644
index 44ea04c..0000000
--- a/res/layout-land/detail_header_contact_without_updates.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact does not have social
-  updates. This is empty because all the information will be displayed elsewhere.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="0dip"/>
\ No newline at end of file
diff --git a/res/layout-sw600dp-land/contact_detail_fragment.xml b/res/layout-sw600dp-land/contact_detail_fragment.xml
deleted file mode 100644
index a48a5b5..0000000
--- a/res/layout-sw600dp-land/contact_detail_fragment.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <!-- Placeholder for empty list -->
-    <include
-        android:id="@android:id/empty"
-        layout="@layout/contact_detail_empty"
-        android:visibility="gone" />
-
-    <!-- Real list -->
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_weight="1"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:baselineAligned="false">
-
-        <include android:id="@+id/static_photo_container"
-            layout="@layout/photo_selector_view"
-            android:layout_width="@dimen/detail_contact_photo_size"
-            android:layout_height="@dimen/detail_contact_photo_size"
-            android:layout_marginTop="@dimen/detail_contact_photo_margin"
-            android:layout_marginRight="@dimen/detail_contact_photo_margin"
-            android:layout_marginEnd="@dimen/detail_contact_photo_margin" />
-
-        <ListView android:id="@android:id/list"
-            android:layout_width="0dip"
-            android:layout_height="match_parent"
-            android:paddingTop="16dip"
-            android:clipToPadding="false"
-            android:fadingEdge="none"
-            android:layout_weight="1"
-            android:divider="@null"
-            android:scrollbarStyle="outsideOverlay"
-            android:paddingRight="16dip"
-            android:paddingEnd="16dip"/>
-
-    </LinearLayout>
-
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_gravity="center"
-        android:layout_marginTop="10dip"
-        android:layout_marginBottom="10dip" />
-</LinearLayout>
diff --git a/res/layout-sw600dp-land/detail_header_contact_without_updates.xml b/res/layout-sw600dp-land/detail_header_contact_without_updates.xml
deleted file mode 100644
index 085b972..0000000
--- a/res/layout-sw600dp-land/detail_header_contact_without_updates.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact does not have social
-  updates, which means that the contact's basic info will scroll with the list of details. The
-  photo is not included because it will be displayed in a static place elsewhere.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingLeft="8dip"
-    android:paddingStart="8dip"
-    android:paddingBottom="16dip"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingRight="16dip"
-        android:paddingEnd="16dip">
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="0dip"
-            android:layout_weight="1"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/detail_header_name_text_size"
-            android:paddingRight="16dip"
-            android:paddingEnd="16dip" />
-
-        <include
-            layout="@layout/favorites_star" />
-
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/company"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="?android:attr/textColorSecondary" />
-
-</LinearLayout>
diff --git a/res/layout-sw600dp/contact_detail_fragment.xml b/res/layout-sw600dp/contact_detail_fragment.xml
deleted file mode 100644
index 1e0f7e6..0000000
--- a/res/layout-sw600dp/contact_detail_fragment.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <!-- Placeholder for empty list -->
-    <include
-        android:id="@android:id/empty"
-        layout="@layout/contact_detail_empty"
-        android:visibility="gone" />
-
-    <!-- Real list -->
-    <ListView android:id="@android:id/list"
-        android:layout_weight="1"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:fadingEdge="none"
-        android:cacheColorHint="#00000000"
-        android:divider="@null"
-        android:scrollbarStyle="outsideOverlay"
-        android:paddingRight="12dip"
-        android:paddingEnd="12dip" />
-
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_gravity="center"
-        android:layout_marginTop="10dip"
-        android:layout_marginBottom="10dip" />
-</LinearLayout>
diff --git a/res/layout-sw600dp/detail_header_contact_without_updates.xml b/res/layout-sw600dp/detail_header_contact_without_updates.xml
deleted file mode 100644
index 069e0de..0000000
--- a/res/layout-sw600dp/detail_header_contact_without_updates.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact does not have social
-  updates, which means that the contact's photo and basic info will scroll with the list of details.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:ex="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingBottom="16dip">
-
-    <!-- Ensure that the contact photo for a contact WITHOUT social updates is the same width and
-    height as a contact WITH social updates (where the photo is 2/3 of the screen width). -->
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        ex:ratio="0.6667"
-        ex:direction="widthToHeight">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="horizontal">
-
-            <include layout="@layout/photo_selector_view"
-                android:layout_width="0dip"
-                android:layout_height="match_parent"
-                android:layout_weight="2" />
-
-            <!-- Empty view to fill the rest of the LinearLayout, so that a weight on its sibling
-            ImageView will work.-->
-            <View
-                android:layout_width="0dip"
-                android:layout_weight="1"
-                android:layout_height="match_parent" />
-
-        </LinearLayout>
-
-    </view>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:paddingTop="8dip"
-        android:paddingEnd="8dip" >
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:paddingStart="8dip"
-            android:paddingEnd="24dip"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/detail_header_name_text_size" />
-
-        <include
-            layout="@layout/favorites_star" />
-
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/company"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingStart="8dip"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="?android:attr/textColorSecondary" />
-
-</LinearLayout>
diff --git a/res/layout-sw720dp-land/contact_detail_empty.xml b/res/layout-sw720dp-land/contact_detail_empty.xml
deleted file mode 100644
index 0ff9960..0000000
--- a/res/layout-sw720dp-land/contact_detail_empty.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Placeholder for empty details for a contact -->
-
-<com.android.contacts.widget.InterpolatingLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:ex="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-    <TextView android:id="@+id/emptyText"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/no_contact_details"
-        android:textSize="20sp"
-        android:textColor="?android:attr/textColorSecondary"
-        ex:layout_wideParentWidth="800dip"
-        ex:layout_wideMarginLeft="80dip"
-        ex:layout_narrowParentWidth="500dip"
-        ex:layout_narrowMarginLeft="44dip"
-        android:paddingTop="10dip"
-        android:lineSpacingMultiplier="0.92"/>
-</com.android.contacts.widget.InterpolatingLayout>
diff --git a/res/layout-sw720dp-land/contact_detail_fragment.xml b/res/layout-sw720dp-land/contact_detail_fragment.xml
deleted file mode 100644
index 4eee458..0000000
--- a/res/layout-sw720dp-land/contact_detail_fragment.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="16dip"
-    android:paddingStart="16dip">
-
-    <!-- Placeholder for empty list -->
-    <include
-        android:id="@android:id/empty"
-        layout="@layout/contact_detail_empty"
-        android:visibility="gone" />
-
-    <!-- Real list -->
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_weight="1"
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:baselineAligned="false">
-
-        <include android:id="@+id/static_photo_container"
-            layout="@layout/photo_selector_view"
-            android:layout_width="@dimen/detail_contact_photo_size"
-            android:layout_height="@dimen/detail_contact_photo_size"
-            android:layout_marginTop="@dimen/detail_contact_photo_margin"
-            android:layout_marginRight="@dimen/detail_contact_photo_margin"
-            android:layout_marginEnd="@dimen/detail_contact_photo_margin" />
-
-        <ListView android:id="@android:id/list"
-            android:layout_width="0dip"
-            android:layout_height="match_parent"
-            android:paddingTop="16dip"
-            android:clipToPadding="false"
-            android:fadingEdge="none"
-            android:layout_weight="1"
-            android:divider="@null"
-            android:paddingRight="16dip"
-            android:paddingEnd="16dip"
-            android:scrollbarStyle="outsideOverlay"/>
-
-    </LinearLayout>
-
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_gravity="center"
-        android:layout_marginTop="10dip"
-        android:layout_marginBottom="10dip" />
-</LinearLayout>
diff --git a/res/layout-sw720dp-land/contact_detail_list_item.xml b/res/layout-sw720dp-land/contact_detail_list_item.xml
deleted file mode 100644
index a5af1dd..0000000
--- a/res/layout-sw720dp-land/contact_detail_list_item.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2010, 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.
- */
--->
-
-<!-- Note: padding might be controlled programatically -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingLeft="16dip"
-    android:paddingStart="16dip">
-
-    <com.android.contacts.detail.ActionsViewContainer
-        android:id="@+id/actions_view_container"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:minHeight="@dimen/detail_min_line_item_height"
-        android:gravity="center_vertical"
-        android:orientation="horizontal"
-        android:focusable="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:nextFocusRight="@+id/secondary_action_view_container">
-
-        <!-- Note: padding might be controlled programatically -->
-        <LinearLayout
-            android:id="@+id/primary_action_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_weight="1"
-            android:paddingLeft="8dip"
-            android:paddingStart="8dip"
-            android:orientation="vertical">
-
-            <TextView
-                android:id="@+id/data"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceMedium" />
-        </LinearLayout>
-
-        <ImageView
-            android:id="@+id/presence_icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="1dip"
-            android:layout_marginRight="4dip"
-            android:layout_marginEnd="4dip"
-            android:layout_gravity="center_vertical"
-            android:scaleType="centerInside" />
-
-        <TextView
-            android:id="@+id/kind"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:visibility="gone" />
-
-        <View
-            android:id="@+id/primary_indicator"
-            android:layout_width="16dip"
-            android:layout_height="16dip"
-            android:visibility="gone"
-            android:layout_gravity="center_vertical"
-            android:background="@drawable/ic_list_default_mime_holo_dark"
-            android:layout_marginRight="8dip"
-            android:layout_marginEnd="8dip" />
-
-        <TextView
-            android:id="@+id/type"
-            style="@style/ContactDetailItemType"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:paddingRight="16dip"
-            android:paddingEnd="16dip" />
-
-        <View
-            android:id="@+id/vertical_divider"
-            android:layout_width="1px"
-            android:layout_height="match_parent"
-            android:layout_marginTop="@dimen/detail_vertical_divider_vertical_margin"
-            android:layout_marginBottom="@dimen/detail_vertical_divider_vertical_margin"
-            android:background="?android:attr/dividerVertical" />
-
-        <!-- Note: padding might be controlled programatically -->
-        <FrameLayout
-            android:id="@+id/secondary_action_view_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingLeft="@dimen/detail_item_icon_margin"
-            android:paddingRight="@dimen/detail_item_icon_margin"
-            android:paddingStart="@dimen/detail_item_icon_margin"
-            android:paddingEnd="@dimen/detail_item_icon_margin"
-            android:duplicateParentState="false"
-            android:focusable="true"
-            android:background="?android:attr/selectableItemBackground"
-            android:nextFocusLeft="@id/actions_view_container">
-            <ImageView
-                android:id="@+id/secondary_action_button"
-                android:layout_width="32dip"
-                android:layout_height="match_parent"
-                android:layout_centerVertical="true"
-                android:gravity="center"
-                android:scaleType="center"
-                android:duplicateParentState="false" />
-        </FrameLayout>
-    </com.android.contacts.detail.ActionsViewContainer>
-</FrameLayout>
diff --git a/res/layout-sw720dp-land/detail_header_contact_without_updates.xml b/res/layout-sw720dp-land/detail_header_contact_without_updates.xml
deleted file mode 100644
index bc3f16c..0000000
--- a/res/layout-sw720dp-land/detail_header_contact_without_updates.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact does not have social
-  updates, which means that the contact's basic info will scroll with the list of details. The
-  photo is not included because it will be displayed in a static place elsewhere.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingStart="8dip"
-    android:paddingBottom="16dip"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingEnd="16dip">
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="0dip"
-            android:layout_weight="1"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/detail_header_name_text_size"
-            android:paddingStart="16dip" />
-
-        <include
-            layout="@layout/favorites_star" />
-
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/company"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="?android:attr/textColorSecondary" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/contact_detail_activity.xml b/res/layout/contact_detail_activity.xml
deleted file mode 100644
index 9765a71..0000000
--- a/res/layout/contact_detail_activity.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail_view"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <!-- This fragment is an invisible worker fragment that loads the contact details. -->
-    <fragment
-        android:id="@+id/loader_fragment"
-        class="com.android.contacts.detail.ContactLoaderFragment"
-        android:layout_height="0dip"
-        android:layout_width="0dip"
-        android:visibility="gone"/>
-
-    <!-- This layout includes all possible views needed for a contact detail page -->
-    <include
-        android:id="@+id/contact_detail_container"
-        layout="@layout/contact_detail_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-
-</FrameLayout>
diff --git a/res/layout/contact_detail_container.xml b/res/layout/contact_detail_container.xml
deleted file mode 100644
index 910d684..0000000
--- a/res/layout/contact_detail_container.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Layout for the contact card page. -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-  <fragment android:name="com.android.contacts.detail.ContactDetailFragment"
-            android:id="@+id/contact_detail_about_fragment"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/contact_detail_empty.xml b/res/layout/contact_detail_empty.xml
deleted file mode 100644
index cdb8feb..0000000
--- a/res/layout/contact_detail_empty.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Placeholder for empty details for a contact -->
-
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:text="@string/no_contact_details"
-    android:textSize="20sp"
-    android:textColor="?android:attr/textColorSecondary"
-    android:layout_marginLeft="15dip"
-    android:layout_marginStart="15dip"
-    android:paddingTop="10dip"
-    android:lineSpacingMultiplier="0.92"/>
\ No newline at end of file
diff --git a/res/layout/contact_detail_fragment.xml b/res/layout/contact_detail_fragment.xml
deleted file mode 100644
index 4d53310..0000000
--- a/res/layout/contact_detail_fragment.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_detail_about_fragment"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ListView android:id="@android:id/list"
-        android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1"
-        android:fadingEdge="none"
-        android:divider="@null"/>
-
-    <ScrollView android:id="@android:id/empty"
-        android:layout_width="match_parent"
-        android:layout_height="0px"
-        android:layout_weight="1"
-        android:fadingEdge="none"
-        android:visibility="gone">
-
-        <TextView android:id="@+id/emptyText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/no_contact_details"
-            android:textSize="20sp"
-            android:textColor="?android:attr/textColorSecondary"
-            android:paddingLeft="10dip"
-            android:paddingRight="10dip"
-            android:paddingStart="10dip"
-            android:paddingEnd="10dip"
-            android:paddingTop="10dip"
-            android:lineSpacingMultiplier="0.92"/>
-
-    </ScrollView>
-
-    <!-- "QuickFix"- button (Copy to local contact, add to group) -->
-    <Button
-        android:id="@+id/contact_quick_fix"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        android:layout_gravity="center"
-        android:layout_marginTop="20dip"
-        android:layout_marginBottom="20dip" />
-</LinearLayout>
-
diff --git a/res/layout/contact_detail_list_item.xml b/res/layout/contact_detail_list_item.xml
deleted file mode 100644
index fb24caa..0000000
--- a/res/layout/contact_detail_list_item.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2009, 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.
- */
--->
-
-<!-- Note: padding might be controlled programatically -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingStart="16dip">
-
-    <com.android.contacts.detail.ActionsViewContainer
-        android:id="@+id/actions_view_container"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        android:focusable="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:nextFocusRight="@+id/secondary_action_view_container"
-        android:minHeight="@dimen/detail_min_line_item_height">
-
-        <!-- Note: padding might be controlled programatically -->
-        <LinearLayout
-            android:id="@+id/primary_action_view"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="vertical"
-            android:paddingStart="8dip" >
-
-            <TextView
-                android:id="@+id/data"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceMedium" />
-
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal">
-
-                <ImageView
-                    android:id="@+id/presence_icon"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="1dip"
-                    android:layout_marginRight="4dip"
-                    android:layout_marginEnd="4dip"
-                    android:layout_gravity="center_vertical"
-                    android:gravity="center"
-                    android:scaleType="centerInside" />
-
-                <TextView
-                    android:id="@+id/type"
-                    style="@style/ContactDetailItemType"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content" />
-
-                <View
-                    android:id="@+id/primary_indicator"
-                    android:layout_width="16dip"
-                    android:layout_height="16dip"
-                    android:visibility="gone"
-                    android:layout_gravity="center_vertical"
-                    android:background="@drawable/ic_list_default_mime_holo_dark" />
-
-            </LinearLayout>
-
-        </LinearLayout>
-
-        <View
-            android:id="@+id/vertical_divider"
-            android:layout_width="1dip"
-            android:layout_height="match_parent"
-            android:layout_marginTop="@dimen/detail_vertical_divider_vertical_margin"
-            android:layout_marginBottom="@dimen/detail_vertical_divider_vertical_margin"
-            android:background="?android:attr/dividerVertical" />
-
-        <!-- Note: padding might be controlled programatically -->
-        <FrameLayout
-            android:id="@+id/secondary_action_view_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingStart="@dimen/detail_item_icon_margin"
-            android:paddingEnd="@dimen/detail_item_icon_margin"
-            android:focusable="true"
-            android:background="?android:attr/selectableItemBackground"
-            android:nextFocusLeft="@id/actions_view_container">
-            <ImageView
-                android:id="@+id/secondary_action_button"
-                android:layout_width="32dip"
-                android:layout_height="32dip"
-                android:layout_gravity="center_vertical"
-                android:duplicateParentState="false" />
-        </FrameLayout>
-    </com.android.contacts.detail.ActionsViewContainer>
-</FrameLayout>
diff --git a/res/layout/contact_detail_loader_fragment.xml b/res/layout/contact_detail_loader_fragment.xml
deleted file mode 100644
index 62edb3d..0000000
--- a/res/layout/contact_detail_loader_fragment.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-    Invisible view.
-    Note we show/hide the fragment at runtime with FragmentTransaction.show()/hide() in order to
-    change the visibility of the options menu.  This means the visibility of the view will be
-    changed at runtime, so we use width/height to make it invisible, rather than using
-    visibility.
--->
-<View xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="0dip"
-    android:layout_height="0dip"/>
\ No newline at end of file
diff --git a/res/layout/detail_header_contact_without_updates.xml b/res/layout/detail_header_contact_without_updates.xml
deleted file mode 100644
index 27f6288..0000000
--- a/res/layout/detail_header_contact_without_updates.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact does not have social
-  updates, which means that the contact's photo will scroll with the list of details.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:ex="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-
-    <!-- Contact photo -->
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        ex:ratio="0.5"
-        ex:direction="widthToHeight">
-
-        <include layout="@layout/photo_selector_view" />
-
-    </view>
-
-    <!-- Shadow -->
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/detail_contact_photo_shadow_height"
-        android:background="?android:attr/windowContentOverlay"/>
-
-</LinearLayout>
diff --git a/res/layout/expanding_entry_card_item.xml b/res/layout/expanding_entry_card_item.xml
index 9195800..dfd450c 100644
--- a/res/layout/expanding_entry_card_item.xml
+++ b/res/layout/expanding_entry_card_item.xml
@@ -40,7 +40,7 @@
         android:layout_height="wrap_content"
         android:layout_alignParentTop="true"
         android:layout_toEndOf="@+id/icon"
-        android:singleLine="true"
+        android:layout_toStartOf="@+id/icon_alternate"
         android:textColor="@color/quickcontact_entry_header_text_color" />
 
     <TextView
@@ -49,6 +49,7 @@
         android:layout_height="wrap_content"
         android:layout_below="@+id/header"
         android:layout_toEndOf="@+id/icon_sub_header"
+        android:layout_toStartOf="@+id/icon_alternate"
         android:textColor="@color/quickcontact_entry_sub_header_text_color" />
 
     <ImageView
@@ -66,6 +67,7 @@
         android:id="@+id/text"
         android:layout_below="@+id/sub_header"
         android:layout_toEndOf="@+id/icon_text"
+        android:layout_toStartOf="@+id/icon_alternate"
         android:textColor="@color/quickcontact_entry_sub_header_text_color" />
 
     <ImageView
diff --git a/res/layout/people_activity.xml b/res/layout/people_activity.xml
index 2624818..ce995cb 100644
--- a/res/layout/people_activity.xml
+++ b/res/layout/people_activity.xml
@@ -41,6 +41,7 @@
         android:id="@+id/contacts_unavailable_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:layout_below="@id/toolbar_parent"
         android:visibility="gone">
         <FrameLayout
             android:id="@+id/contacts_unavailable_container"
diff --git a/res/layout/photo_selector_view.xml b/res/layout/photo_selector_view.xml
deleted file mode 100644
index 1a21c30..0000000
--- a/res/layout/photo_selector_view.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!--
-  View for displaying photos that show a photo selector when clicked.
--->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ImageView
-        android:id="@+id/photo"
-        android:scaleType="centerCrop"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <View
-        android:id="@+id/photo_touch_intercept_overlay"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="?android:attr/selectableItemBackground"
-        android:visibility="gone"
-        android:contentDescription="@string/contact_detail_picture_description"/>
-
-</FrameLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 7c6b635..f0376f6 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -53,15 +53,6 @@
     <!-- Left padding of the label in the add field button for the contact editor -->
     <dimen name="editor_add_field_label_left_padding">16dip</dimen>
 
-    <!-- Height of the shadow asset under the photo on the contact detail page -->
-    <dimen name="detail_contact_photo_shadow_height">10dip</dimen>
-
-    <!-- Margin around the contact's photo on the contact card -->
-    <dimen name="detail_contact_photo_margin">8dip</dimen>
-
-    <!-- Width and height of the contact photo on the contact detail page -->
-    <dimen name="detail_contact_photo_size">128dip</dimen>
-
     <!-- Width and height of the expanded contact photo on the contact detail page -->
     <dimen name="detail_contact_photo_expanded_size">400dip</dimen>
 
@@ -72,22 +63,12 @@
     <!-- Minimum width for the photo action popup options -->
     <dimen name="photo_action_popup_min_width">300dip</dimen>
 
-    <!-- Left and right padding for a contact detail item -->
-    <dimen name="detail_item_icon_margin">8dip</dimen>
-
     <!-- Top and bottom padding for a contact detail item -->
     <dimen name="detail_item_vertical_margin">8dip</dimen>
 
     <!-- Minimum height of a row in the contact detail -->
     <dimen name="detail_min_line_item_height">48dip</dimen>
 
-    <!-- Font size for the display name in header of the contact detail page -->
-    <dimen name="detail_header_name_text_size">36sp</dimen>
-
-    <!-- Vertical margin for vertical dividers existing between primary data
-         (phone number, email, etc.) and a secondary action button -->
-    <dimen name="detail_vertical_divider_vertical_margin">16dip</dimen>
-
     <!-- Font size used for the contact name in the widget -->
     <dimen name="widget_text_size_name">14sp</dimen>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9583fcb..4d07bc7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -372,9 +372,6 @@
     <!-- Text used to explain that a contact cannot be edited from the People application since the data is read only [CHAR LIMIT=40] -->
     <string name="contact_read_only">Not editable from this app.</string>
 
-    <!-- Text describing that a contact has no information available other than name and photo. [CHAR LIMIT=60] -->
-    <string name="no_contact_details">No additional information for this contact.</string>
-
     <!-- Text used to explain that a group cannot be edited since the data is read only [CHAR LIMIT=40] -->
     <string name="group_read_only">Not editable on this device.</string>
 
@@ -646,9 +643,6 @@
     <!-- Menu item shown only when the special debug mode is enabled, which is used to send all contacts database files via email.  [CHAR LIMI=NONE] -->
     <string name="menu_export_database">Export database files</string>
 
-    <!-- Description when picture in the contact detail view is selected. [CHAR LIMIT=NONE] -->
-    <string name="contact_detail_picture_description">Picture. Select to change</string>
-
     <!-- Content description for the button that adds a new contact
          [CHAR LIMIT=NONE] -->
     <string name="action_menu_add_new_contact_button">add new contact</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index af3c031..815b5b0 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -202,14 +202,6 @@
         <item name="android:layout_width">match_parent</item>
     </style>
 
-    <style name="ContactDetailItemType">
-        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
-        <item name="android:singleLine">true</item>
-        <item name="android:ellipsize">marquee</item>
-        <item name="android:layout_gravity">center_vertical</item>
-    </style>
-
     <style name="ConfirmAddDetailViewStyle">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index e27419a..6a5c1cb 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -311,10 +311,9 @@
     private void update(boolean skipAnimation) {
         final boolean isIconifiedChanging
                 = (mSearchContainer.getParent() == null) == mSearchMode;
-        mToolbar.removeView(mLandscapeTabs);
         if (isIconifiedChanging && !skipAnimation) {
+            mToolbar.removeView(mLandscapeTabs);
             if (mSearchMode) {
-                mToolbar.removeView(mLandscapeTabs);
                 addSearchContainer();
                 mSearchContainer.setAlpha(0);
                 mSearchContainer.animate().alpha(1);
@@ -336,9 +335,9 @@
             return;
         }
         if (isIconifiedChanging && skipAnimation) {
+            mToolbar.removeView(mLandscapeTabs);
             if (mSearchMode) {
                 setPortraitTabHeight(0);
-                mToolbar.removeView(mLandscapeTabs);
                 addSearchContainer();
             } else {
                 setPortraitTabHeight(mMaxPortraitTabHeight);
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
deleted file mode 100644
index 849923d..0000000
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2010 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.activities;
-
-import android.app.ActionBar;
-import android.app.Fragment;
-import android.content.ActivityNotFoundException;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.Toast;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.ContactsActivity;
-import com.android.contacts.R;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.detail.ContactDetailFragment;
-import com.android.contacts.detail.ContactDetailLayoutController;
-import com.android.contacts.detail.ContactDisplayUtils;
-import com.android.contacts.detail.ContactLoaderFragment;
-import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
-import com.android.contacts.interactions.ContactDeletionInteraction;
-
-import java.util.ArrayList;
-
-public class ContactDetailActivity extends ContactsActivity {
-    private static final String TAG = "ContactDetailActivity";
-
-    private Contact mContactData;
-    private Uri mLookupUri;
-
-    private ContactDetailLayoutController mContactDetailLayoutController;
-    private ContactLoaderFragment mLoaderFragment;
-
-    private Handler mHandler = new Handler();
-
-    @Override
-    protected void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
-
-        setContentView(R.layout.contact_detail_activity);
-
-        mContactDetailLayoutController = new ContactDetailLayoutController(this, savedState,
-                getFragmentManager(), null, mContactDetailFragmentListener);
-
-        // We want the UP affordance but no app icon.
-        // Setting HOME_AS_UP, SHOW_TITLE and clearing SHOW_HOME does the trick.
-        ActionBar actionBar = getActionBar();
-        if (actionBar != null) {
-            actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE,
-                    ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE
-                    | ActionBar.DISPLAY_SHOW_HOME);
-            actionBar.setTitle("");
-        }
-    }
-
-    @Override
-    public void onAttachFragment(Fragment fragment) {
-         if (fragment instanceof ContactLoaderFragment) {
-            mLoaderFragment = (ContactLoaderFragment) fragment;
-            mLoaderFragment.setListener(mLoaderFragmentListener);
-            mLoaderFragment.loadUri(getIntent().getData());
-        }
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.star, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        final MenuItem starredMenuItem = menu.findItem(R.id.menu_star);
-        starredMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
-            @Override
-            public boolean onMenuItemClick(MenuItem item) {
-                // Toggle "starred" state
-                // Make sure there is a contact
-                if (mLookupUri != null) {
-                    // Read the current starred value from the UI instead of using the last
-                    // loaded state. This allows rapid tapping without writing the same
-                    // value several times
-                    final boolean isStarred = starredMenuItem.isChecked();
-
-                    // To improve responsiveness, swap out the picture (and tag) in the UI already
-                    ContactDisplayUtils.configureStarredMenuItem(starredMenuItem,
-                            mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
-                            !isStarred);
-
-                    // Now perform the real save
-                    Intent intent = ContactSaveService.createSetStarredIntent(
-                            ContactDetailActivity.this, mLookupUri, !isStarred);
-                    ContactDetailActivity.this.startService(intent);
-                }
-                return true;
-            }
-        });
-        // If there is contact data, update the starred state
-        if (mContactData != null) {
-            ContactDisplayUtils.configureStarredMenuItem(starredMenuItem,
-                    mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
-                    mContactData.getStarred());
-        }
-        return true;
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        // First check if the {@link ContactLoaderFragment} can handle the key
-        if (mLoaderFragment != null && mLoaderFragment.handleKeyDown(keyCode)) return true;
-
-        // Otherwise find the correct fragment to handle the event
-        FragmentKeyListener mCurrentFragment = mContactDetailLayoutController.getCurrentPage();
-        if (mCurrentFragment != null && mCurrentFragment.handleKeyDown(keyCode)) return true;
-
-        // In the last case, give the key event to the superclass.
-        return super.onKeyDown(keyCode, event);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (mContactDetailLayoutController != null) {
-            mContactDetailLayoutController.onSaveInstanceState(outState);
-        }
-    }
-
-    private final ContactLoaderFragmentListener mLoaderFragmentListener =
-            new ContactLoaderFragmentListener() {
-        @Override
-        public void onContactNotFound() {
-            finish();
-        }
-
-        @Override
-        public void onDetailsLoaded(final Contact result) {
-            if (result == null) {
-                return;
-            }
-            // Since {@link FragmentTransaction}s cannot be done in the onLoadFinished() of the
-            // {@link LoaderCallbacks}, then post this {@link Runnable} to the {@link Handler}
-            // on the main thread to execute later.
-            mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    // If the activity is destroyed (or will be destroyed soon), don't update the UI
-                    if (isFinishing()) {
-                        return;
-                    }
-                    mContactData = result;
-                    mLookupUri = result.getLookupUri();
-                    invalidateOptionsMenu();
-                    setupTitle();
-                    mContactDetailLayoutController.setContactData(mContactData);
-                }
-            });
-        }
-
-        @Override
-        public void onEditRequested(Uri contactLookupUri) {
-            Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
-            intent.putExtra(
-                    ContactEditorActivity.INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
-            // Don't finish the detail activity after launching the editor because when the
-            // editor is done, we will still want to show the updated contact details using
-            // this activity.
-            startActivity(intent);
-        }
-
-        @Override
-        public void onDeleteRequested(Uri contactUri) {
-            ContactDeletionInteraction.start(ContactDetailActivity.this, contactUri, true);
-        }
-    };
-
-    /**
-     * Setup the activity title and subtitle with contact name and company.
-     */
-    private void setupTitle() {
-        CharSequence displayName = ContactDisplayUtils.getDisplayName(this, mContactData);
-        String company =  ContactDisplayUtils.getCompany(this, mContactData);
-
-        ActionBar actionBar = getActionBar();
-        actionBar.setTitle(displayName);
-        actionBar.setSubtitle(company);
-
-        final StringBuilder talkback = new StringBuilder();
-        if (!TextUtils.isEmpty(displayName)) {
-            talkback.append(displayName);
-        }
-        if (!TextUtils.isEmpty(company)) {
-            if (talkback.length() != 0) {
-                talkback.append(", ");
-            }
-            talkback.append(company);
-        }
-
-        if (talkback.length() != 0) {
-            AccessibilityManager accessibilityManager =
-                    (AccessibilityManager) this.getSystemService(Context.ACCESSIBILITY_SERVICE);
-            if (accessibilityManager.isEnabled()) {
-                View decorView = getWindow().getDecorView();
-                decorView.setContentDescription(talkback);
-                decorView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-            }
-        }
-    }
-
-    private final ContactDetailFragment.Listener mContactDetailFragmentListener =
-            new ContactDetailFragment.Listener() {
-        @Override
-        public void onItemClicked(Intent intent) {
-            if (intent == null) {
-                return;
-            }
-            try {
-                startActivity(intent);
-            } catch (ActivityNotFoundException e) {
-                Log.e(TAG, "No activity found for intent: " + intent);
-            }
-        }
-
-        @Override
-        public void onCreateRawContactRequested(
-                ArrayList<ContentValues> values, AccountWithDataSet account) {
-            Toast.makeText(ContactDetailActivity.this, R.string.toast_making_personal_copy,
-                    Toast.LENGTH_LONG).show();
-            Intent serviceIntent = ContactSaveService.createNewRawContactIntent(
-                    ContactDetailActivity.this, values, account,
-                    ContactDetailActivity.class, Intent.ACTION_VIEW);
-            startService(serviceIntent);
-
-        }
-    };
-
-    /**
-     * This interface should be implemented by {@link Fragment}s within this
-     * activity so that the activity can determine whether the currently
-     * displayed view is handling the key event or not.
-     */
-    public interface FragmentKeyListener {
-        /**
-         * Returns true if the key down event will be handled by the implementing class, or false
-         * otherwise.
-         */
-        public boolean handleKeyDown(int keyCode);
-    }
-}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 7c0b14b..363e459 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -274,7 +274,7 @@
         }
 
         if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
-            redirect = new Intent(this, ContactDetailActivity.class);
+            redirect = new Intent(this, QuickContactActivity.class);
             redirect.setAction(Intent.ACTION_VIEW);
             redirect.setData(mRequest.getContactUri());
             startActivity(redirect);
@@ -580,6 +580,10 @@
                     mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
                     break;
             }
+            // When using the mContactsUnavailableFragment the ViewPager doesn't contain two views.
+            // Therefore, we have to trick the ViewPagerTabs into thinking we have changed tabs
+            // when the mContactsUnavailableFragment changes. Otherwise the tab strip won't move.
+            mViewPagerTabs.onPageScrolled(tab, 0, 0);
         }
     }
 
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
deleted file mode 100644
index 50be097..0000000
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ /dev/null
@@ -1,2250 +0,0 @@
-/*
- * Copyright (C) 2010 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.detail;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.ComponentName;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Directory;
-import android.provider.ContactsContract.StatusUpdates;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.DragEvent;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnDragListener;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.widget.AbsListView.OnScrollListener;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.ListPopupWindow;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.R;
-import com.android.contacts.TypePrecedence;
-import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.common.ClipboardUtils;
-import com.android.contacts.common.Collapser.Collapsible;
-import com.android.contacts.common.ContactPresenceIconUtil;
-import com.android.contacts.common.ContactsUtils;
-import com.android.contacts.common.GroupMetaData;
-import com.android.contacts.common.MoreContactUtils;
-import com.android.contacts.common.editor.SelectAccountDialogFragment;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.model.RawContact;
-import com.android.contacts.common.model.RawContactDelta;
-import com.android.contacts.common.model.RawContactDeltaList;
-import com.android.contacts.common.model.RawContactModifier;
-import com.android.contacts.common.model.ValuesDelta;
-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.common.model.dataitem.DataItem;
-import com.android.contacts.common.model.dataitem.DataKind;
-import com.android.contacts.common.model.dataitem.EmailDataItem;
-import com.android.contacts.common.model.dataitem.EventDataItem;
-import com.android.contacts.common.model.dataitem.GroupMembershipDataItem;
-import com.android.contacts.common.model.dataitem.ImDataItem;
-import com.android.contacts.common.model.dataitem.NicknameDataItem;
-import com.android.contacts.common.model.dataitem.NoteDataItem;
-import com.android.contacts.common.model.dataitem.OrganizationDataItem;
-import com.android.contacts.common.model.dataitem.PhoneDataItem;
-import com.android.contacts.common.model.dataitem.RelationDataItem;
-import com.android.contacts.common.model.dataitem.SipAddressDataItem;
-import com.android.contacts.common.model.dataitem.StructuredNameDataItem;
-import com.android.contacts.common.model.dataitem.StructuredPostalDataItem;
-import com.android.contacts.common.model.dataitem.WebsiteDataItem;
-import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.util.DataStatus;
-import com.android.contacts.util.PhoneCapabilityTester;
-import com.android.contacts.util.StructuredPostalUtils;
-import com.android.contacts.util.UiClosables;
-import com.google.common.base.Objects;
-import com.google.common.collect.Iterables;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ContactDetailFragment extends Fragment implements FragmentKeyListener,
-        SelectAccountDialogFragment.Listener, OnItemClickListener {
-
-    private static final String TAG = "ContactDetailFragment";
-
-    private static final int TEXT_DIRECTION_UNDEFINED = -1;
-
-    private interface ContextMenuIds {
-        static final int COPY_TEXT = 0;
-        static final int CLEAR_DEFAULT = 1;
-        static final int SET_DEFAULT = 2;
-    }
-
-    private static final String KEY_CONTACT_URI = "contactUri";
-    private static final String KEY_LIST_STATE = "liststate";
-
-    private Context mContext;
-    private View mView;
-    private OnScrollListener mVerticalScrollListener;
-    private Uri mLookupUri;
-    private Listener mListener;
-
-    private Contact mContactData;
-    private ViewGroup mStaticPhotoContainer;
-    private View mPhotoTouchOverlay;
-    private ListView mListView;
-    private ViewAdapter mAdapter;
-    private Uri mPrimaryPhoneUri = null;
-    private ViewEntryDimensions mViewEntryDimensions;
-
-    private final ContactDetailPhotoSetter mPhotoSetter = new ContactDetailPhotoSetter();
-
-    private Button mQuickFixButton;
-    private QuickFix mQuickFix;
-    private boolean mShowStaticPhoto = true;
-
-    private final QuickFix[] mPotentialQuickFixes = new QuickFix[] {
-            new MakeLocalCopyQuickFix(),
-            new AddToMyContactsQuickFix()
-    };
-
-    /**
-     * The view shown if the detail list is empty.
-     * We set this to the list view when first bind the adapter, so that it won't be shown while
-     * we're loading data.
-     */
-    private View mEmptyView;
-
-    /**
-     * Saved state of the {@link ListView}. This must be saved and applied to the {@ListView} only
-     * when the adapter has been populated again.
-     */
-    private Parcelable mListState;
-
-    /**
-     * Lists of specific types of entries to be shown in contact details.
-     */
-    private ArrayList<DetailViewEntry> mPhoneEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mSmsEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mEmailEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mPostalEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mImEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mNicknameEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mGroupEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mRelationEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mNoteEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mWebsiteEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mSipEntries = new ArrayList<DetailViewEntry>();
-    private ArrayList<DetailViewEntry> mEventEntries = new ArrayList<DetailViewEntry>();
-    private final Map<AccountType, List<DetailViewEntry>> mOtherEntriesMap =
-            new HashMap<AccountType, List<DetailViewEntry>>();
-    private ArrayList<ViewEntry> mAllEntries = new ArrayList<ViewEntry>();
-    private LayoutInflater mInflater;
-
-    private boolean mIsUniqueNumber;
-    private boolean mIsUniqueEmail;
-
-    private ListPopupWindow mPopup;
-
-    /**
-     * This is to forward touch events to the list view to enable users to scroll the list view
-     * from the blank area underneath the static photo when the layout with static photo is used.
-     */
-    private OnTouchListener mForwardTouchToListView = new OnTouchListener() {
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            if (mListView != null) {
-                mListView.dispatchTouchEvent(event);
-                return true;
-            }
-            return false;
-        }
-    };
-
-    /**
-     * This is to forward drag events to the list view to enable users to scroll the list view
-     * from the blank area underneath the static photo when the layout with static photo is used.
-     */
-    private OnDragListener mForwardDragToListView = new OnDragListener() {
-        @Override
-        public boolean onDrag(View v, DragEvent event) {
-            if (mListView != null) {
-                mListView.dispatchDragEvent(event);
-                return true;
-            }
-            return false;
-        }
-    };
-
-    public ContactDetailFragment() {
-        // Explicit constructor for inflation
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (savedInstanceState != null) {
-            mLookupUri = savedInstanceState.getParcelable(KEY_CONTACT_URI);
-            mListState = savedInstanceState.getParcelable(KEY_LIST_STATE);
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putParcelable(KEY_CONTACT_URI, mLookupUri);
-        if (mListView != null) {
-            outState.putParcelable(KEY_LIST_STATE, mListView.onSaveInstanceState());
-        }
-    }
-
-    @Override
-    public void onPause() {
-        dismissPopupIfShown();
-        super.onPause();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-    }
-
-    @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        mContext = activity;
-        mViewEntryDimensions = new ViewEntryDimensions(mContext.getResources());
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
-        mView = inflater.inflate(R.layout.contact_detail_fragment, container, false);
-        // Set the touch and drag listener to forward the event to the mListView so that
-        // vertical scrolling can happen from outside of the list view.
-        mView.setOnTouchListener(mForwardTouchToListView);
-        mView.setOnDragListener(mForwardDragToListView);
-
-        mInflater = inflater;
-
-        mStaticPhotoContainer = (ViewGroup) mView.findViewById(R.id.static_photo_container);
-        mPhotoTouchOverlay = mView.findViewById(R.id.photo_touch_intercept_overlay);
-
-        mListView = (ListView) mView.findViewById(android.R.id.list);
-        mListView.setOnItemClickListener(this);
-        mListView.setItemsCanFocus(true);
-        mListView.setOnScrollListener(mVerticalScrollListener);
-
-        // Don't set it to mListView yet.  We do so later when we bind the adapter.
-        mEmptyView = mView.findViewById(android.R.id.empty);
-
-        mQuickFixButton = (Button) mView.findViewById(R.id.contact_quick_fix);
-        mQuickFixButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mQuickFix != null) {
-                    mQuickFix.execute();
-                }
-            }
-        });
-
-        mView.setVisibility(View.INVISIBLE);
-
-        if (mContactData != null) {
-            bindData();
-        }
-
-        return mView;
-    }
-
-    public void setListener(Listener value) {
-        mListener = value;
-    }
-
-    protected Context getContext() {
-        return mContext;
-    }
-
-    protected Listener getListener() {
-        return mListener;
-    }
-
-    protected Contact getContactData() {
-        return mContactData;
-    }
-
-    public void setVerticalScrollListener(OnScrollListener listener) {
-        mVerticalScrollListener = listener;
-    }
-
-    public Uri getUri() {
-        return mLookupUri;
-    }
-
-    /**
-     * Sets whether the static contact photo (that is not in a scrolling region), should be shown
-     * or not.
-     */
-    public void setShowStaticPhoto(boolean showPhoto) {
-        mShowStaticPhoto = showPhoto;
-    }
-
-    /**
-     * Shows the contact detail with a message indicating there are no contact details.
-     */
-    public void showEmptyState() {
-        setData(null, null);
-    }
-
-    public void setData(Uri lookupUri, Contact result) {
-        mLookupUri = lookupUri;
-        mContactData = result;
-        bindData();
-    }
-
-    /**
-     * Reset the list adapter in this {@link Fragment} to get rid of any saved scroll position
-     * from a previous contact.
-     */
-    public void resetAdapter() {
-        if (mListView != null) {
-            mListView.setAdapter(mAdapter);
-        }
-    }
-
-    /**
-     * Returns the top coordinate of the first item in the {@link ListView}. If the first item
-     * in the {@link ListView} is not visible or there are no children in the list, then return
-     * Integer.MIN_VALUE. Note that the returned value will be <= 0 because the first item in the
-     * list cannot have a positive offset.
-     */
-    public int getFirstListItemOffset() {
-        return ContactDisplayUtils.getFirstListItemOffset(mListView);
-    }
-
-    /**
-     * Tries to scroll the first item to the given offset (this can be a no-op if the list is
-     * already in the correct position).
-     * @param offset which should be <= 0
-     */
-    public void requestToMoveToOffset(int offset) {
-        ContactDisplayUtils.requestToMoveToOffset(mListView, offset);
-    }
-
-    protected void bindData() {
-        if (mView == null) {
-            return;
-        }
-
-        if (isAdded()) {
-            getActivity().invalidateOptionsMenu();
-        }
-
-        if (mContactData == null) {
-            mView.setVisibility(View.INVISIBLE);
-            if (mStaticPhotoContainer != null) {
-                mStaticPhotoContainer.setVisibility(View.GONE);
-            }
-            mAllEntries.clear();
-            if (mAdapter != null) {
-                mAdapter.notifyDataSetChanged();
-            }
-            return;
-        }
-
-        // Setup the photo if applicable
-        if (mStaticPhotoContainer != null) {
-            // The presence of a static photo container is not sufficient to determine whether or
-            // not we should show the photo. Check the mShowStaticPhoto flag which can be set by an
-            // outside class depending on screen size, layout, and whether the contact has social
-            // updates or not.
-            if (mShowStaticPhoto) {
-                mStaticPhotoContainer.setVisibility(View.VISIBLE);
-                final ImageView photoView = (ImageView) mStaticPhotoContainer.findViewById(
-                        R.id.photo);
-                final boolean expandPhotoOnClick = mContactData.getPhotoUri() != null;
-                final OnClickListener listener = mPhotoSetter.setupContactPhotoForClick(
-                        mContext, mContactData, photoView, expandPhotoOnClick);
-                if (mPhotoTouchOverlay != null) {
-                    mPhotoTouchOverlay.setVisibility(View.VISIBLE);
-                    if (expandPhotoOnClick || mContactData.isWritableContact(mContext)) {
-                        mPhotoTouchOverlay.setOnClickListener(listener);
-                    } else {
-                        mPhotoTouchOverlay.setClickable(false);
-                    }
-                }
-            } else {
-                mStaticPhotoContainer.setVisibility(View.GONE);
-            }
-        }
-
-        // Build up the contact entries
-        buildEntries();
-
-        // Collapse similar data items for select {@link DataKind}s.
-        /*Collapser.collapseList(mPhoneEntries);
-        Collapser.collapseList(mSmsEntries);
-        Collapser.collapseList(mEmailEntries);
-        Collapser.collapseList(mPostalEntries);
-        Collapser.collapseList(mImEntries);
-        Collapser.collapseList(mEventEntries);
-        Collapser.collapseList(mWebsiteEntries);*/
-
-        mIsUniqueNumber = mPhoneEntries.size() == 1;
-        mIsUniqueEmail = mEmailEntries.size() == 1;
-
-        // Make one aggregated list of all entries for display to the user.
-        setupFlattenedList();
-
-        if (mAdapter == null) {
-            mAdapter = new ViewAdapter();
-            mListView.setAdapter(mAdapter);
-        }
-
-        // Restore {@link ListView} state if applicable because the adapter is now populated.
-        if (mListState != null) {
-            mListView.onRestoreInstanceState(mListState);
-            mListState = null;
-        }
-
-        mAdapter.notifyDataSetChanged();
-
-        mListView.setEmptyView(mEmptyView);
-
-        configureQuickFix();
-
-        mView.setVisibility(View.VISIBLE);
-    }
-
-    /*
-     * Sets {@link #mQuickFix} to a useful action and configures the visibility of
-     * {@link #mQuickFixButton}
-     */
-    private void configureQuickFix() {
-        mQuickFix = null;
-
-        for (QuickFix fix : mPotentialQuickFixes) {
-            if (fix.isApplicable()) {
-                mQuickFix = fix;
-                break;
-            }
-        }
-
-        // Configure the button
-        if (mQuickFix == null) {
-            mQuickFixButton.setVisibility(View.GONE);
-        } else {
-            mQuickFixButton.setVisibility(View.VISIBLE);
-            mQuickFixButton.setText(mQuickFix.getTitle());
-        }
-    }
-
-    /** @return default group id or -1 if no group or several groups are marked as default */
-    private long getDefaultGroupId(List<GroupMetaData> groups) {
-        long defaultGroupId = -1;
-        for (GroupMetaData group : groups) {
-            if (group.isDefaultGroup()) {
-                // two default groups? return neither
-                if (defaultGroupId != -1) return -1;
-                defaultGroupId = group.getGroupId();
-            }
-        }
-        return defaultGroupId;
-    }
-
-    /**
-     * Build up the entries to display on the screen.
-     */
-    private final void buildEntries() {
-        final boolean hasPhone = PhoneCapabilityTester.isPhone(mContext);
-        final ComponentName smsComponent = PhoneCapabilityTester.getSmsComponent(getContext());
-        final boolean hasSms = (smsComponent != null);
-        final boolean hasSip = PhoneCapabilityTester.isSipPhone(mContext);
-
-        // Clear out the old entries
-        mAllEntries.clear();
-
-        mPrimaryPhoneUri = null;
-
-        // Build up method entries
-        if (mContactData == null) {
-            return;
-        }
-
-        ArrayList<String> groups = new ArrayList<String>();
-        for (RawContact rawContact: mContactData.getRawContacts()) {
-            final long rawContactId = rawContact.getId();
-            final AccountType accountType = rawContact.getAccountType(mContext);
-            for (DataItem dataItem : rawContact.getDataItems()) {
-                //dataItem.setRawContactId(rawContactId);
-
-                //if (dataItem.getMimeType() == null) continue;
-
-                if (dataItem instanceof GroupMembershipDataItem) {
-                    GroupMembershipDataItem groupMembership =
-                            (GroupMembershipDataItem) dataItem;
-                    Long groupId = groupMembership.getGroupRowId();
-                    if (groupId != null) {
-                        handleGroupMembership(groups, mContactData.getGroupMetaData(), groupId);
-                    }
-                    continue;
-                }
-
-                final DataKind kind = AccountTypeManager.getInstance(mContext)
-                        .getKindOrFallback(accountType, dataItem.getMimeType());
-                if (kind == null) continue;
-
-                final DetailViewEntry entry = DetailViewEntry.fromValues(mContext, dataItem,
-                        mContactData.isDirectoryEntry(), mContactData.getDirectoryId(), kind);
-                entry.maxLines = kind.maxLinesForDisplay;
-
-                final boolean hasData = !TextUtils.isEmpty(entry.data);
-                final boolean isSuperPrimary = dataItem.isSuperPrimary();
-
-                if (dataItem instanceof StructuredNameDataItem) {
-                    // Always ignore the name. It is shown in the header if set
-                } else if (dataItem instanceof PhoneDataItem && hasData) {
-                    PhoneDataItem phone = (PhoneDataItem) dataItem;
-                    // Build phone entries
-                    entry.data = phone.getFormattedPhoneNumber();
-                    final Intent phoneIntent = hasPhone ?
-                            CallUtil.getCallIntent(entry.data) : null;
-                    Intent smsIntent = null;
-                    if (hasSms) {
-                        smsIntent = new Intent(Intent.ACTION_SENDTO,
-                                Uri.fromParts(CallUtil.SCHEME_SMSTO, entry.data, null));
-                        smsIntent.setComponent(smsComponent);
-                    }
-
-                    // Configure Icons and Intents.
-                    if (hasPhone && hasSms) {
-                        entry.intent = phoneIntent;
-                        entry.secondaryIntent = smsIntent;
-                        entry.secondaryActionIcon = kind.iconAltRes;
-                        entry.secondaryActionDescription =
-                                com.android.contacts.common.util.ContactDisplayUtils.
-                                        getSmsLabelResourceId(entry.type);
-                    } else if (hasPhone) {
-                        entry.intent = phoneIntent;
-                    } else if (hasSms) {
-                        entry.intent = smsIntent;
-                    } else {
-                        entry.intent = null;
-                    }
-
-                    // Remember super-primary phone
-                    if (isSuperPrimary) mPrimaryPhoneUri = entry.uri;
-
-                    entry.isPrimary = isSuperPrimary;
-
-                    // If the entry is a primary entry, then render it first in the view.
-                    if (entry.isPrimary) {
-                        // add to beginning of list so that this phone number shows up first
-                        mPhoneEntries.add(0, entry);
-                    } else {
-                        // add to end of list
-                        mPhoneEntries.add(entry);
-                    }
-
-                    // Configure the text direction. Phone numbers should be displayed LTR
-                    // regardless of what locale the device is in.
-                    entry.textDirection = View.TEXT_DIRECTION_LTR;
-                } else if (dataItem instanceof EmailDataItem && hasData) {
-                    // Build email entries
-                    entry.intent = new Intent(Intent.ACTION_SENDTO,
-                            Uri.fromParts(CallUtil.SCHEME_MAILTO, entry.data, null));
-                    entry.isPrimary = isSuperPrimary;
-                    // If entry is a primary entry, then render it first in the view.
-                    if (entry.isPrimary) {
-                        mEmailEntries.add(0, entry);
-                    } else {
-                        mEmailEntries.add(entry);
-                    }
-
-                    // When Email rows have status, create additional Im row
-                    final DataStatus status = mContactData.getStatuses().get(entry.id);
-                    if (status != null) {
-                        EmailDataItem email = (EmailDataItem) dataItem;
-                        ImDataItem im = ImDataItem.createFromEmail(email);
-
-                        final DetailViewEntry imEntry = DetailViewEntry.fromValues(mContext, im,
-                                mContactData.isDirectoryEntry(), mContactData.getDirectoryId(),
-                                kind);
-                        // buildImActions(mContext, imEntry, im);
-                        imEntry.setPresence(status.getPresence());
-                        imEntry.maxLines = kind.maxLinesForDisplay;
-                        mImEntries.add(imEntry);
-                    }
-                } else if (dataItem instanceof StructuredPostalDataItem && hasData) {
-                    // Build postal entries
-                    entry.intent = StructuredPostalUtils.getViewPostalAddressIntent(entry.data);
-                    mPostalEntries.add(entry);
-                } else if (dataItem instanceof ImDataItem && hasData) {
-                    // Build IM entries
-                    /*buildImActions(mContext, entry, (ImDataItem) dataItem);
-
-                    // Apply presence when available
-                    final DataStatus status = mContactData.getStatuses().get(entry.id);
-                    if (status != null) {
-                        entry.setPresence(status.getPresence());
-                    }
-                    mImEntries.add(entry);*/
-                } else if (dataItem instanceof OrganizationDataItem) {
-                    // Organizations are not shown. The first one is shown in the header
-                    // and subsequent ones are not supported anymore
-                } else if (dataItem instanceof NicknameDataItem && hasData) {
-                    // Build nickname entries
-                   /*final boolean isNameRawContact =
-                        (mContactData.getNameRawContactId() == rawContactId);
-
-                    final boolean duplicatesTitle =
-                        isNameRawContact
-                        && mContactData.getDisplayNameSource() == DisplayNameSources.NICKNAME;
-
-                    if (!duplicatesTitle) {
-                        entry.uri = null;
-                        mNicknameEntries.add(entry);
-                    }*/
-                } else if (dataItem instanceof NoteDataItem && hasData) {
-                    // Build note entries
-                    // entry.uri = null;
-                    //mNoteEntries.add(entry);
-                } else if (dataItem instanceof WebsiteDataItem && hasData) {
-                    // Build Website entries
-                    /*entry.uri = null;
-                    try {
-                        WebAddress webAddress = new WebAddress(entry.data);
-                        entry.intent = new Intent(Intent.ACTION_VIEW,
-                                Uri.parse(webAddress.toString()));
-                    } catch (ParseException e) {
-                        Log.e(TAG, "Couldn't parse website: " + entry.data);
-                    }
-                    mWebsiteEntries.add(entry);*/
-                } else if (dataItem instanceof SipAddressDataItem && hasData) {
-                    // Build SipAddress entries
-                    /*entry.uri = null;
-                    if (hasSip) {
-                        entry.intent = CallUtil.getCallIntent(
-                                Uri.fromParts(CallUtil.SCHEME_SIP, entry.data, null));
-                    } else {
-                        entry.intent = null;
-                    }
-                    mSipEntries.add(entry);*/
-                    // TODO: Now that SipAddress is in its own list of entries
-                    // (instead of grouped in mOtherEntries), consider
-                    // repositioning it right under the phone number.
-                    // (Then, we'd also update FallbackAccountType.java to set
-                    // secondary=false for this field, and tweak the weight
-                    // of its DataKind.)
-                } else if (dataItem instanceof EventDataItem && hasData) {
-                    /*final Calendar cal = DateUtils.parseDate(entry.data, false);
-                    if (cal != null) {
-                        final Date nextAnniversary =
-                                DateUtils.getNextAnnualDate(cal);
-                        final Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
-                        builder.appendPath("time");
-                        ContentUris.appendId(builder, nextAnniversary.getTime());
-                        entry.intent = new Intent(Intent.ACTION_VIEW).setData(builder.build());
-                    }
-                    entry.data = DateUtils.formatDate(mContext, entry.data);
-                    entry.uri = null;
-                    mEventEntries.add(entry);*/
-                } else if (dataItem instanceof RelationDataItem && hasData) {
-                    /*entry.intent = new Intent(Intent.ACTION_SEARCH);
-                    entry.intent.putExtra(SearchManager.QUERY, entry.data);
-                    entry.intent.setType(Contacts.CONTENT_TYPE);
-                    mRelationEntries.add(entry);*/
-                } else {
-                    // Handle showing custom rows
-                    entry.intent = new Intent(Intent.ACTION_VIEW);
-                    entry.intent.setDataAndType(entry.uri, entry.mimetype);
-
-                    entry.data = dataItem.buildDataString(getContext(), kind);
-
-                    if (!TextUtils.isEmpty(entry.data)) {
-                        // If the account type exists in the hash map, add it as another entry for
-                        // that account type
-                        if (mOtherEntriesMap.containsKey(accountType)) {
-                            List<DetailViewEntry> listEntries = mOtherEntriesMap.get(accountType);
-                            listEntries.add(entry);
-                        } else {
-                            // Otherwise create a new list with the entry and add it to the hash map
-                            List<DetailViewEntry> listEntries = new ArrayList<DetailViewEntry>();
-                            listEntries.add(entry);
-                            mOtherEntriesMap.put(accountType, listEntries);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (!groups.isEmpty()) {
-            DetailViewEntry entry = new DetailViewEntry();
-            Collections.sort(groups);
-            StringBuilder sb = new StringBuilder();
-            int size = groups.size();
-            for (int i = 0; i < size; i++) {
-                if (i != 0) {
-                    sb.append(", ");
-                }
-                sb.append(groups.get(i));
-            }
-            entry.mimetype = GroupMembership.MIMETYPE;
-            entry.kind = mContext.getString(R.string.groupsLabel);
-            entry.data = sb.toString();
-            mGroupEntries.add(entry);
-        }
-    }
-
-    /**
-     * Collapse all contact detail entries into one aggregated list with a {@link HeaderViewEntry}
-     * at the top.
-     */
-    private void setupFlattenedList() {
-        // All contacts should have a header view (even if there is no data for the contact).
-        mAllEntries.add(new HeaderViewEntry());
-
-        addPhoneticName();
-
-        flattenList(mPhoneEntries);
-        flattenList(mSmsEntries);
-        flattenList(mEmailEntries);
-        flattenList(mImEntries);
-        flattenList(mNicknameEntries);
-        flattenList(mWebsiteEntries);
-
-        addNetworks();
-
-        flattenList(mSipEntries);
-        flattenList(mPostalEntries);
-        flattenList(mEventEntries);
-        flattenList(mGroupEntries);
-        flattenList(mRelationEntries);
-        flattenList(mNoteEntries);
-    }
-
-    /**
-     * Add phonetic name (if applicable) to the aggregated list of contact details. This has to be
-     * done manually because phonetic name doesn't have a mimetype or action intent.
-     */
-    private void addPhoneticName() {
-        String phoneticName = ContactDisplayUtils.getPhoneticName(mContext, mContactData);
-        if (TextUtils.isEmpty(phoneticName)) {
-            return;
-        }
-
-        // Add a title
-        String phoneticNameKindTitle = mContext.getString(R.string.name_phonetic);
-        mAllEntries.add(new KindTitleViewEntry(phoneticNameKindTitle.toUpperCase()));
-
-        // Add the phonetic name
-        final DetailViewEntry entry = new DetailViewEntry();
-        entry.kind = phoneticNameKindTitle;
-        entry.data = phoneticName;
-        mAllEntries.add(entry);
-    }
-
-    /**
-     * Add attribution and other third-party entries (if applicable) under the "networks" section
-     * of the aggregated list of contact details. This has to be done manually because the
-     * attribution does not have a mimetype and the third-party entries don't have actually belong
-     * to the same {@link DataKind}.
-     */
-    private void addNetworks() {
-        String attribution = ContactDisplayUtils.getAttribution(mContext, mContactData);
-        boolean hasAttribution = !TextUtils.isEmpty(attribution);
-        int networksCount = mOtherEntriesMap.keySet().size();
-
-        // Note: invitableCount will always be 0 for me profile.  (ContactLoader won't set
-        // invitable types for me profile.)
-        int invitableCount = mContactData.getInvitableAccountTypes().size();
-        if (!hasAttribution && networksCount == 0 && invitableCount == 0) {
-            return;
-        }
-
-        // Add a title
-        String networkKindTitle = mContext.getString(R.string.connections);
-        mAllEntries.add(new KindTitleViewEntry(networkKindTitle.toUpperCase()));
-
-        // Add the attribution if applicable
-        if (hasAttribution) {
-            final DetailViewEntry entry = new DetailViewEntry();
-            entry.kind = networkKindTitle;
-            entry.data = attribution;
-            mAllEntries.add(entry);
-
-            // Add a divider below the attribution if there are network details that will follow
-            if (networksCount > 0) {
-                mAllEntries.add(new SeparatorViewEntry());
-            }
-        }
-
-        // Add the other entries from third parties
-        for (AccountType accountType : mOtherEntriesMap.keySet()) {
-
-            // Add a title for each third party app
-            mAllEntries.add(new NetworkTitleViewEntry(mContext, accountType));
-
-            for (DetailViewEntry detailEntry : mOtherEntriesMap.get(accountType)) {
-                // Add indented separator
-                SeparatorViewEntry separatorEntry = new SeparatorViewEntry();
-                separatorEntry.setIsInSubSection(true);
-                mAllEntries.add(separatorEntry);
-
-                // Add indented detail
-                detailEntry.setIsInSubSection(true);
-                mAllEntries.add(detailEntry);
-            }
-        }
-
-        mOtherEntriesMap.clear();
-
-        // Add the "More networks" button, which opens the invitable account type list popup.
-        if (invitableCount > 0) {
-            addMoreNetworks();
-        }
-    }
-
-    /**
-     * Add the "More networks" entry.  When clicked, show a popup containing a list of invitable
-     * account types.
-     */
-    private void addMoreNetworks() {
-        // First, prepare for the popup.
-
-        // Adapter for the list popup.
-        final InvitableAccountTypesAdapter popupAdapter = new InvitableAccountTypesAdapter(mContext,
-                mContactData);
-
-        // Listener called when a popup item is clicked.
-        final AdapterView.OnItemClickListener popupItemListener
-                = new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position,
-                    long id) {
-                if (mListener != null && mContactData != null) {
-                    mListener.onItemClicked(MoreContactUtils.getInvitableIntent(
-                            popupAdapter.getItem(position) /* account type */,
-                            mContactData.getLookupUri()));
-                }
-            }
-        };
-
-        // Then create the click listener for the "More network" entry.  Open the popup.
-        View.OnClickListener onClickListener = new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                showListPopup(v, popupAdapter, popupItemListener);
-            }
-        };
-
-        // Finally create the entry.
-        mAllEntries.add(new AddConnectionViewEntry(mContext, onClickListener));
-    }
-
-    /**
-     * Iterate through {@link DetailViewEntry} in the given list and add it to a list of all
-     * entries. Add a {@link KindTitleViewEntry} at the start if the length of the list is not 0.
-     * Add {@link SeparatorViewEntry}s as dividers as appropriate. Clear the original list.
-     */
-    private void flattenList(ArrayList<DetailViewEntry> entries) {
-        int count = entries.size();
-
-        // Add a title for this kind by extracting the kind from the first entry
-        if (count > 0) {
-            String kind = entries.get(0).kind;
-            mAllEntries.add(new KindTitleViewEntry(kind.toUpperCase()));
-        }
-
-        // Add all the data entries for this kind
-        for (int i = 0; i < count; i++) {
-            // For all entries except the first one, add a divider above the entry
-            if (i != 0) {
-                mAllEntries.add(new SeparatorViewEntry());
-            }
-            mAllEntries.add(entries.get(i));
-        }
-
-        // Clear old list because it's not needed anymore.
-        entries.clear();
-    }
-
-    /**
-     * Maps group ID to the corresponding group name, collapses all synonymous groups.
-     * Ignores default groups (e.g. My Contacts) and favorites groups.
-     */
-    private void handleGroupMembership(
-            ArrayList<String> groups, List<GroupMetaData> groupMetaData, long groupId) {
-        if (groupMetaData == null) {
-            return;
-        }
-
-        for (GroupMetaData group : groupMetaData) {
-            if (group.getGroupId() == groupId) {
-                if (!group.isDefaultGroup() && !group.isFavorites()) {
-                    String title = group.getTitle();
-                    if (!TextUtils.isEmpty(title) && !groups.contains(title)) {
-                        groups.add(title);
-                    }
-                }
-                break;
-            }
-        }
-    }
-
-    /**
-     * Writes the Instant Messaging action into the given entry value.
-     */
-    /*@VisibleForTesting
-    public static void buildImActions(Context context, DetailViewEntry entry,
-            ImDataItem im) {
-        final boolean isEmail = im.isCreatedFromEmail();
-
-        if (!isEmail && !im.isProtocolValid()) {
-            return;
-        }
-
-        final String data = im.getData();
-        if (TextUtils.isEmpty(data)) {
-            return;
-        }
-
-        final int protocol = isEmail ? Im.PROTOCOL_GOOGLE_TALK : im.getProtocol();
-
-        if (protocol == Im.PROTOCOL_GOOGLE_TALK) {
-            final int chatCapability = im.getChatCapability();
-            entry.chatCapability = chatCapability;
-            entry.typeString = Im.getProtocolLabel(context.getResources(), Im.PROTOCOL_GOOGLE_TALK,
-                    null).toString();
-            if ((chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
-                entry.intent =
-                        new Intent(Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?message"));
-                entry.secondaryIntent =
-                        new Intent(Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?call"));
-            } else if ((chatCapability & Im.CAPABILITY_HAS_VOICE) != 0) {
-                // Allow Talking and Texting
-                entry.intent =
-                    new Intent(Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?message"));
-                entry.secondaryIntent =
-                    new Intent(Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?call"));
-            } else {
-                entry.intent =
-                    new Intent(Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?message"));
-            }
-        } else {
-            // Build an IM Intent
-            final Intent imIntent = getCustomIMIntent(im, protocol);
-            if (imIntent != null &&
-                    PhoneCapabilityTester.isIntentRegistered(context, imIntent)) {
-                entry.intent = imIntent;
-            }
-        }
-    }*/
-
-    /*@VisibleForTesting
-    public static Intent getCustomIMIntent(ImDataItem im, int protocol) {
-        String host = im.getCustomProtocol();
-        final String data = im.getData();
-        if (TextUtils.isEmpty(data)) {
-            return null;
-        }
-        if (protocol != Im.PROTOCOL_CUSTOM) {
-            // Try bringing in a well-known host for specific protocols
-            host = ContactsUtils.lookupProviderNameFromId(protocol);
-        }
-        if (TextUtils.isEmpty(host)) {
-            return null;
-        }
-        final String authority = host.toLowerCase();
-        final Uri imUri = new Uri.Builder().scheme(CallUtil.SCHEME_IMTO).authority(
-                authority).appendPath(data).build();
-        final Intent intent = new Intent(Intent.ACTION_SENDTO, imUri);
-        return intent;
-    }*/
-
-    /**
-     * Show a list popup.  Used for "popup-able" entry, such as "More networks".
-     */
-    private void showListPopup(View anchorView, ListAdapter adapter,
-            final AdapterView.OnItemClickListener onItemClickListener) {
-        dismissPopupIfShown();
-        mPopup = new ListPopupWindow(mContext, null);
-        mPopup.setAnchorView(anchorView);
-        mPopup.setWidth(anchorView.getWidth());
-        mPopup.setAdapter(adapter);
-        mPopup.setModal(true);
-
-        // We need to wrap the passed onItemClickListener here, so that we can dismiss() the
-        // popup afterwards.  Otherwise we could directly use the passed listener.
-        mPopup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position,
-                    long id) {
-                onItemClickListener.onItemClick(parent, view, position, id);
-                dismissPopupIfShown();
-            }
-        });
-        mPopup.show();
-    }
-
-    private void dismissPopupIfShown() {
-        UiClosables.closeQuietly(mPopup);
-        mPopup = null;
-    }
-
-    /**
-     * Base class for an item in the {@link ViewAdapter} list of data, which is
-     * supplied to the {@link ListView}.
-     */
-    static class ViewEntry {
-        private final int viewTypeForAdapter;
-        protected long id = -1;
-        /** Whether or not the entry can be focused on or not. */
-        protected boolean isEnabled = false;
-
-        ViewEntry(int viewType) {
-            viewTypeForAdapter = viewType;
-        }
-
-        int getViewType() {
-            return viewTypeForAdapter;
-        }
-
-        long getId() {
-            return id;
-        }
-
-        boolean isEnabled(){
-            return isEnabled;
-        }
-
-        /**
-         * Called when the entry is clicked.  Only {@link #isEnabled} entries can get clicked.
-         *
-         * @param clickedView  {@link View} that was clicked  (Used, for example, as the anchor view
-         *        for a popup.)
-         * @param fragmentListener  {@link Listener} set to {@link ContactDetailFragment}
-         */
-        public void click(View clickedView, Listener fragmentListener) {
-        }
-    }
-
-    /**
-     * Header item in the {@link ViewAdapter} list of data.
-     */
-    private static class HeaderViewEntry extends ViewEntry {
-
-        HeaderViewEntry() {
-            super(ViewAdapter.VIEW_TYPE_HEADER_ENTRY);
-        }
-
-    }
-
-    /**
-     * Separator between items of the same {@link DataKind} in the
-     * {@link ViewAdapter} list of data.
-     */
-    private static class SeparatorViewEntry extends ViewEntry {
-
-        /**
-         * Whether or not the entry is in a subsection (if true then the contents will be indented
-         * to the right)
-         */
-        private boolean mIsInSubSection = false;
-
-        SeparatorViewEntry() {
-            super(ViewAdapter.VIEW_TYPE_SEPARATOR_ENTRY);
-        }
-
-        public void setIsInSubSection(boolean isInSubSection) {
-            mIsInSubSection = isInSubSection;
-        }
-
-        public boolean isInSubSection() {
-            return mIsInSubSection;
-        }
-    }
-
-    /**
-     * Title entry for items of the same {@link DataKind} in the
-     * {@link ViewAdapter} list of data.
-     */
-    private static class KindTitleViewEntry extends ViewEntry {
-
-        private final String mTitle;
-
-        KindTitleViewEntry(String titleText) {
-            super(ViewAdapter.VIEW_TYPE_KIND_TITLE_ENTRY);
-            mTitle = titleText;
-        }
-
-        public String getTitle() {
-            return mTitle;
-        }
-    }
-
-    /**
-     * A title for a section of contact details from a single 3rd party network.
-     */
-    private static class NetworkTitleViewEntry extends ViewEntry {
-        private final Drawable mIcon;
-        private final CharSequence mLabel;
-
-        public NetworkTitleViewEntry(Context context, AccountType type) {
-            super(ViewAdapter.VIEW_TYPE_NETWORK_TITLE_ENTRY);
-            this.mIcon = type.getDisplayIcon(context);
-            this.mLabel = type.getDisplayLabel(context);
-            this.isEnabled = false;
-        }
-
-        public Drawable getIcon() {
-            return mIcon;
-        }
-
-        public CharSequence getLabel() {
-            return mLabel;
-        }
-    }
-
-    /**
-     * This is used for the "Add Connections" entry.
-     */
-    private static class AddConnectionViewEntry extends ViewEntry {
-        private final Drawable mIcon;
-        private final CharSequence mLabel;
-        private final View.OnClickListener mOnClickListener;
-
-        private AddConnectionViewEntry(Context context, View.OnClickListener onClickListener) {
-            super(ViewAdapter.VIEW_TYPE_ADD_CONNECTION_ENTRY);
-            this.mIcon = context.getResources().getDrawable(
-                    R.drawable.ic_menu_add_field_holo_light);
-            this.mLabel = context.getString(R.string.add_connection_button);
-            this.mOnClickListener = onClickListener;
-            this.isEnabled = true;
-        }
-
-        @Override
-        public void click(View clickedView, Listener fragmentListener) {
-            if (mOnClickListener == null) return;
-            mOnClickListener.onClick(clickedView);
-        }
-
-        public Drawable getIcon() {
-            return mIcon;
-        }
-
-        public CharSequence getLabel() {
-            return mLabel;
-        }
-    }
-
-    /**
-     * An item with a single detail for a contact in the {@link ViewAdapter}
-     * list of data.
-     */
-    static class DetailViewEntry extends ViewEntry implements Collapsible<DetailViewEntry> {
-        // TODO: Make getters/setters for these fields
-        public int type = -1;
-        public String kind;
-        public String typeString;
-        public String data;
-        public Uri uri;
-        public int maxLines = 1;
-        public int textDirection = TEXT_DIRECTION_UNDEFINED;
-        public String mimetype;
-
-        public Context context = null;
-        public boolean isPrimary = false;
-        public int secondaryActionIcon = -1;
-        public int secondaryActionDescription = -1;
-        public Intent intent;
-        public Intent secondaryIntent = null;
-        public ArrayList<Long> ids = new ArrayList<Long>();
-        public int collapseCount = 0;
-
-        public int presence = -1;
-        public int chatCapability = 0;
-
-        private boolean mIsInSubSection = false;
-
-        @Override
-        public String 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() {
-            super(ViewAdapter.VIEW_TYPE_DETAIL_ENTRY);
-            isEnabled = true;
-        }
-
-        /**
-         * Build new {@link DetailViewEntry} and populate from the given values.
-         */
-        public static DetailViewEntry fromValues(Context context, DataItem item,
-                boolean isDirectoryEntry, long directoryId, DataKind dataKind) {
-            final DetailViewEntry entry = new DetailViewEntry();
-            entry.id = item.getId();
-            entry.context = context;
-            entry.uri = ContentUris.withAppendedId(Data.CONTENT_URI, entry.id);
-            if (isDirectoryEntry) {
-                entry.uri = entry.uri.buildUpon().appendQueryParameter(
-                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(directoryId)).build();
-            }
-            entry.mimetype = item.getMimeType();
-            entry.kind = dataKind.getKindString(context);
-            entry.data = item.buildDataString(context, dataKind);
-
-            if (item.hasKindTypeColumn(dataKind)) {
-                entry.type = item.getKindTypeColumn(dataKind);
-
-                // get type string
-                entry.typeString = "";
-                for (EditType type : dataKind.typeList) {
-                    if (type.rawValue == entry.type) {
-                        if (type.customColumn == null) {
-                            // Non-custom type. Get its description from the resource
-                            entry.typeString = context.getString(type.labelRes);
-                        } else {
-                            // Custom type. Read it from the database
-                            entry.typeString =
-                                    item.getContentValues().getAsString(type.customColumn);
-                        }
-                        break;
-                    }
-                }
-            } else {
-                entry.typeString = "";
-            }
-
-            return entry;
-        }
-
-        public void setPresence(int presence) {
-            this.presence = presence;
-        }
-
-        public void setIsInSubSection(boolean isInSubSection) {
-            mIsInSubSection = isInSubSection;
-        }
-
-        public boolean isInSubSection() {
-            return mIsInSubSection;
-        }
-
-        @Override
-        public void collapseWith(DetailViewEntry entry) {
-            // Choose the label associated with the highest type precedence.
-            if (TypePrecedence.getTypePrecedence(mimetype, type)
-                    > TypePrecedence.getTypePrecedence(entry.mimetype, entry.type)) {
-                type = entry.type;
-                kind = entry.kind;
-                typeString = entry.typeString;
-            }
-
-            // Choose the max of the maxLines and maxLabelLines values.
-            maxLines = Math.max(maxLines, entry.maxLines);
-
-            // Choose the presence with the highest precedence.
-            if (StatusUpdates.getPresencePrecedence(presence)
-                    < StatusUpdates.getPresencePrecedence(entry.presence)) {
-                presence = entry.presence;
-            }
-
-            // If any of the collapsed entries are primary make the whole thing primary.
-            isPrimary = entry.isPrimary ? true : isPrimary;
-
-            // uri, and contactdId, shouldn't make a difference. Just keep the original.
-
-            // Keep track of all the ids that have been collapsed with this one.
-            ids.add(entry.getId());
-            collapseCount++;
-        }
-
-        @Override
-        public boolean shouldCollapseWith(DetailViewEntry entry, Context context) {
-            if (entry == null) {
-                return false;
-            }
-
-            if (!MoreContactUtils.shouldCollapse(mimetype, data, entry.mimetype, entry.data)) {
-                return false;
-            }
-
-            if (!TextUtils.equals(mimetype, entry.mimetype)
-                    || !ContactsUtils.areIntentActionEqual(intent, entry.intent)
-                    || !ContactsUtils.areIntentActionEqual(
-                            secondaryIntent, entry.secondaryIntent)) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public void click(View clickedView, Listener fragmentListener) {
-            if (fragmentListener == null || intent == null) return;
-            fragmentListener.onItemClicked(intent);
-        }
-    }
-
-    /**
-     * Cache of the children views for a view that displays a header view entry.
-     */
-    private static class HeaderViewCache {
-        public final TextView displayNameView;
-        public final TextView companyView;
-        public final ImageView photoView;
-        public final View photoOverlayView;
-        public final ImageView starredView;
-        public final int layoutResourceId;
-
-        public HeaderViewCache(View view, int layoutResourceInflated) {
-            displayNameView = (TextView) view.findViewById(R.id.name);
-            companyView = (TextView) view.findViewById(R.id.company);
-            photoView = (ImageView) view.findViewById(R.id.photo);
-            photoOverlayView = view.findViewById(R.id.photo_touch_intercept_overlay);
-            starredView = (ImageView) view.findViewById(R.id.star);
-            layoutResourceId = layoutResourceInflated;
-        }
-
-        public void enablePhotoOverlay(OnClickListener listener) {
-            if (photoOverlayView != null) {
-                photoOverlayView.setOnClickListener(listener);
-                photoOverlayView.setVisibility(View.VISIBLE);
-            }
-        }
-    }
-
-    private static class KindTitleViewCache {
-        public final TextView titleView;
-
-        public KindTitleViewCache(View view) {
-            titleView = (TextView)view.findViewById(R.id.title);
-        }
-    }
-
-    /**
-     * Cache of the children views for a view that displays a {@link NetworkTitleViewEntry}
-     */
-    private static class NetworkTitleViewCache {
-        public final TextView name;
-        public final ImageView icon;
-
-        public NetworkTitleViewCache(View view) {
-            name = (TextView) view.findViewById(R.id.network_title);
-            icon = (ImageView) view.findViewById(R.id.network_icon);
-        }
-    }
-
-    /**
-     * Cache of the children views for a view that displays a {@link AddConnectionViewEntry}
-     */
-    private static class AddConnectionViewCache {
-        public final TextView name;
-        public final ImageView icon;
-        public final View primaryActionView;
-
-        public AddConnectionViewCache(View view) {
-            name = (TextView) view.findViewById(R.id.add_connection_label);
-            icon = (ImageView) view.findViewById(R.id.add_connection_icon);
-            primaryActionView = view.findViewById(R.id.primary_action_view);
-        }
-    }
-
-    /**
-     * Cache of the children views of a contact detail entry represented by a
-     * {@link DetailViewEntry}
-     */
-    private static class DetailViewCache {
-        public final TextView type;
-        public final TextView data;
-        public final ImageView presenceIcon;
-        public final ImageView secondaryActionButton;
-        public final View actionsViewContainer;
-        public final View primaryActionView;
-        public final View secondaryActionViewContainer;
-        public final View secondaryActionDivider;
-        public final View primaryIndicator;
-
-        public DetailViewCache(View view,
-                OnClickListener primaryActionClickListener,
-                OnClickListener secondaryActionClickListener) {
-            type = (TextView) view.findViewById(R.id.type);
-            data = (TextView) view.findViewById(R.id.data);
-            primaryIndicator = view.findViewById(R.id.primary_indicator);
-            presenceIcon = (ImageView) view.findViewById(R.id.presence_icon);
-
-            actionsViewContainer = view.findViewById(R.id.actions_view_container);
-            actionsViewContainer.setOnClickListener(primaryActionClickListener);
-            primaryActionView = view.findViewById(R.id.primary_action_view);
-
-            secondaryActionViewContainer = view.findViewById(
-                    R.id.secondary_action_view_container);
-            secondaryActionViewContainer.setOnClickListener(
-                    secondaryActionClickListener);
-            secondaryActionButton = (ImageView) view.findViewById(
-                    R.id.secondary_action_button);
-
-            secondaryActionDivider = view.findViewById(R.id.vertical_divider);
-        }
-    }
-
-    private final class ViewAdapter extends BaseAdapter {
-
-        public static final int VIEW_TYPE_DETAIL_ENTRY = 0;
-        public static final int VIEW_TYPE_HEADER_ENTRY = 1;
-        public static final int VIEW_TYPE_KIND_TITLE_ENTRY = 2;
-        public static final int VIEW_TYPE_NETWORK_TITLE_ENTRY = 3;
-        public static final int VIEW_TYPE_ADD_CONNECTION_ENTRY = 4;
-        public static final int VIEW_TYPE_SEPARATOR_ENTRY = 5;
-        private static final int VIEW_TYPE_COUNT = 6;
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            switch (getItemViewType(position)) {
-                case VIEW_TYPE_HEADER_ENTRY:
-                    return getHeaderEntryView(convertView, parent);
-                case VIEW_TYPE_SEPARATOR_ENTRY:
-                    return getSeparatorEntryView(position, convertView, parent);
-                case VIEW_TYPE_KIND_TITLE_ENTRY:
-                    return getKindTitleEntryView(position, convertView, parent);
-                case VIEW_TYPE_DETAIL_ENTRY:
-                    return getDetailEntryView(position, convertView, parent);
-                case VIEW_TYPE_NETWORK_TITLE_ENTRY:
-                    return getNetworkTitleEntryView(position, convertView, parent);
-                case VIEW_TYPE_ADD_CONNECTION_ENTRY:
-                    return getAddConnectionEntryView(position, convertView, parent);
-                default:
-                    throw new IllegalStateException("Invalid view type ID " +
-                            getItemViewType(position));
-            }
-        }
-
-        private View getHeaderEntryView(View convertView, ViewGroup parent) {
-            final int desiredLayoutResourceId = R.layout.detail_header_contact_without_updates;
-            View result = null;
-            HeaderViewCache viewCache = null;
-
-            // Only use convertView if it has the same layout resource ID as the one desired
-            // (the two can be different on wide 2-pane screens where the detail fragment is reused
-            // for many different contacts that do and do not have social updates).
-            if (convertView != null) {
-                viewCache = (HeaderViewCache) convertView.getTag();
-                if (viewCache.layoutResourceId == desiredLayoutResourceId) {
-                    result = convertView;
-                }
-            }
-
-            // Otherwise inflate a new header view and create a new view cache.
-            if (result == null) {
-                result = mInflater.inflate(desiredLayoutResourceId, parent, false);
-                viewCache = new HeaderViewCache(result, desiredLayoutResourceId);
-                result.setTag(viewCache);
-            }
-
-            ContactDisplayUtils.setDisplayName(mContext, mContactData,
-                    viewCache.displayNameView);
-            ContactDisplayUtils.setCompanyName(mContext, mContactData, viewCache.companyView);
-
-            // Set the photo if it should be displayed
-            if (viewCache.photoView != null) {
-                final boolean expandOnClick = mContactData.getPhotoUri() != null;
-                final OnClickListener listener = mPhotoSetter.setupContactPhotoForClick(
-                        mContext, mContactData, viewCache.photoView, expandOnClick);
-
-                if (expandOnClick || mContactData.isWritableContact(mContext)) {
-                    viewCache.enablePhotoOverlay(listener);
-                }
-            }
-
-            // Set the starred state if it should be displayed
-            final ImageView favoritesStar = viewCache.starredView;
-            if (favoritesStar != null) {
-                ContactDisplayUtils.configureStarredImageView(favoritesStar,
-                        mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
-                        mContactData.getStarred());
-                final Uri lookupUri = mContactData.getLookupUri();
-                favoritesStar.setOnClickListener(new OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        // Toggle "starred" state
-                        // Make sure there is a contact
-                        if (lookupUri != null) {
-                            // Read the current starred value from the UI instead of using the last
-                            // loaded state. This allows rapid tapping without writing the same
-                            // value several times
-                            final Object tag = favoritesStar.getTag();
-                            final boolean isStarred = tag == null
-                                    ? false : (Boolean) favoritesStar.getTag();
-
-                            // To improve responsiveness, swap out the picture (and tag) in the UI
-                            // already
-                            ContactDisplayUtils.configureStarredImageView(favoritesStar,
-                                    mContactData.isDirectoryEntry(), mContactData.isUserProfile(),
-                                    !isStarred);
-
-                            // Now perform the real save
-                            Intent intent = ContactSaveService.createSetStarredIntent(
-                                    getContext(), lookupUri, !isStarred);
-                            getContext().startService(intent);
-                        }
-                    }
-                });
-            }
-
-            return result;
-        }
-
-        private View getSeparatorEntryView(int position, View convertView, ViewGroup parent) {
-            final SeparatorViewEntry entry = (SeparatorViewEntry) getItem(position);
-            final View result = (convertView != null) ? convertView :
-                    mInflater.inflate(R.layout.contact_detail_separator_entry_view, parent, false);
-
-            result.setPadding(entry.isInSubSection() ? mViewEntryDimensions.getWidePaddingLeft() :
-                    mViewEntryDimensions.getPaddingLeft(), 0,
-                    mViewEntryDimensions.getPaddingRight(), 0);
-
-            return result;
-        }
-
-        private View getKindTitleEntryView(int position, View convertView, ViewGroup parent) {
-            final KindTitleViewEntry entry = (KindTitleViewEntry) getItem(position);
-            final View result;
-            final KindTitleViewCache viewCache;
-
-            if (convertView != null) {
-                result = convertView;
-                viewCache = (KindTitleViewCache)result.getTag();
-            } else {
-                result = mInflater.inflate(R.layout.list_separator, parent, false);
-                viewCache = new KindTitleViewCache(result);
-                result.setTag(viewCache);
-            }
-
-            viewCache.titleView.setText(entry.getTitle());
-
-            return result;
-        }
-
-        private View getNetworkTitleEntryView(int position, View convertView, ViewGroup parent) {
-            final NetworkTitleViewEntry entry = (NetworkTitleViewEntry) getItem(position);
-            final View result;
-            final NetworkTitleViewCache viewCache;
-
-            if (convertView != null) {
-                result = convertView;
-                viewCache = (NetworkTitleViewCache) result.getTag();
-            } else {
-                result = mInflater.inflate(R.layout.contact_detail_network_title_entry_view,
-                        parent, false);
-                viewCache = new NetworkTitleViewCache(result);
-                result.setTag(viewCache);
-            }
-
-            viewCache.name.setText(entry.getLabel());
-            viewCache.icon.setImageDrawable(entry.getIcon());
-
-            return result;
-        }
-
-        private View getAddConnectionEntryView(int position, View convertView, ViewGroup parent) {
-            final AddConnectionViewEntry entry = (AddConnectionViewEntry) getItem(position);
-            final View result;
-            final AddConnectionViewCache viewCache;
-
-            if (convertView != null) {
-                result = convertView;
-                viewCache = (AddConnectionViewCache) result.getTag();
-            } else {
-                result = mInflater.inflate(R.layout.contact_detail_add_connection_entry_view,
-                        parent, false);
-                viewCache = new AddConnectionViewCache(result);
-                result.setTag(viewCache);
-            }
-            viewCache.name.setText(entry.getLabel());
-            viewCache.icon.setImageDrawable(entry.getIcon());
-            viewCache.primaryActionView.setOnClickListener(entry.mOnClickListener);
-
-            return result;
-        }
-
-        private View getDetailEntryView(int position, View convertView, ViewGroup parent) {
-            final DetailViewEntry entry = (DetailViewEntry) getItem(position);
-            final View v;
-            final DetailViewCache viewCache;
-
-            // Check to see if we can reuse convertView
-            if (convertView != null) {
-                v = convertView;
-                viewCache = (DetailViewCache) v.getTag();
-            } else {
-                // Create a new view if needed
-                v = mInflater.inflate(R.layout.contact_detail_list_item, parent, false);
-
-                // Cache the children
-                viewCache = new DetailViewCache(v,
-                        mPrimaryActionClickListener, mSecondaryActionClickListener);
-                v.setTag(viewCache);
-            }
-
-            bindDetailView(position, v, entry);
-            return v;
-        }
-
-        private void bindDetailView(int position, View view, DetailViewEntry entry) {
-            final Resources resources = mContext.getResources();
-            DetailViewCache views = (DetailViewCache) view.getTag();
-
-            if (!TextUtils.isEmpty(entry.typeString)) {
-                views.type.setText(entry.typeString.toUpperCase());
-                views.type.setVisibility(View.VISIBLE);
-            } else {
-                views.type.setVisibility(View.GONE);
-            }
-
-            views.data.setText(entry.data);
-            setMaxLines(views.data, entry.maxLines);
-
-            // Gray out the data item if it does not perform an action when clicked
-            // Set primary_text_color even if it might have been set by default to avoid
-            // views being gray sometimes when they are not supposed to, due to view reuse
-            ((TextView) view.findViewById(R.id.data)).setTextColor(
-                        getResources().getColor((entry.intent == null) ?
-                        R.color.secondary_text_color : R.color.primary_text_color));
-
-            // Set the default contact method
-            views.primaryIndicator.setVisibility(entry.isPrimary ? View.VISIBLE : View.GONE);
-
-            // Set the presence icon
-            final Drawable presenceIcon = ContactPresenceIconUtil.getPresenceIcon(
-                    mContext, entry.presence);
-            final ImageView presenceIconView = views.presenceIcon;
-            if (presenceIcon != null) {
-                presenceIconView.setImageDrawable(presenceIcon);
-                presenceIconView.setVisibility(View.VISIBLE);
-            } else {
-                presenceIconView.setVisibility(View.GONE);
-            }
-
-            final ActionsViewContainer actionsButtonContainer =
-                    (ActionsViewContainer) views.actionsViewContainer;
-            actionsButtonContainer.setTag(entry);
-            actionsButtonContainer.setPosition(position);
-            registerForContextMenu(actionsButtonContainer);
-
-            // Set the secondary action button
-            final ImageView secondaryActionView = views.secondaryActionButton;
-            Drawable secondaryActionIcon = null;
-            String secondaryActionDescription = null;
-            if (entry.secondaryActionIcon != -1) {
-                secondaryActionIcon = resources.getDrawable(entry.secondaryActionIcon);
-                if (com.android.contacts.common.util.ContactDisplayUtils.isCustomPhoneType(
-                        entry.type)) {
-                    secondaryActionDescription = resources.getString(
-                            entry.secondaryActionDescription, entry.typeString);
-                } else {
-                    secondaryActionDescription = resources.getString(
-                            entry.secondaryActionDescription);
-                }
-            } else if ((entry.chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
-                secondaryActionIcon =
-                        resources.getDrawable(R.drawable.sym_action_videochat_holo_light);
-                secondaryActionDescription = resources.getString(R.string.video_chat);
-            } else if ((entry.chatCapability & Im.CAPABILITY_HAS_VOICE) != 0) {
-                secondaryActionIcon =
-                        resources.getDrawable(R.drawable.sym_action_audiochat_holo_light);
-                secondaryActionDescription = resources.getString(R.string.audio_chat);
-            }
-
-            final View secondaryActionViewContainer = views.secondaryActionViewContainer;
-            if (entry.secondaryIntent != null && secondaryActionIcon != null) {
-                secondaryActionView.setImageDrawable(secondaryActionIcon);
-                secondaryActionView.setContentDescription(secondaryActionDescription);
-                secondaryActionViewContainer.setTag(entry);
-                secondaryActionViewContainer.setVisibility(View.VISIBLE);
-                views.secondaryActionDivider.setVisibility(View.VISIBLE);
-            } else {
-                secondaryActionViewContainer.setVisibility(View.GONE);
-                views.secondaryActionDivider.setVisibility(View.GONE);
-            }
-
-            // Right and left padding should not have "pressed" effect.
-            view.setPadding(
-                    entry.isInSubSection()
-                            ? mViewEntryDimensions.getWidePaddingLeft()
-                            : mViewEntryDimensions.getPaddingLeft(),
-                    0, mViewEntryDimensions.getPaddingRight(), 0);
-            // Top and bottom padding should have "pressed" effect.
-            final View primaryActionView = views.primaryActionView;
-            primaryActionView.setPadding(
-                    primaryActionView.getPaddingLeft(),
-                    mViewEntryDimensions.getPaddingTop(),
-                    primaryActionView.getPaddingRight(),
-                    mViewEntryDimensions.getPaddingBottom());
-            secondaryActionViewContainer.setPadding(
-                    secondaryActionViewContainer.getPaddingLeft(),
-                    mViewEntryDimensions.getPaddingTop(),
-                    secondaryActionViewContainer.getPaddingRight(),
-                    mViewEntryDimensions.getPaddingBottom());
-
-            // Set the text direction
-            if (entry.textDirection != TEXT_DIRECTION_UNDEFINED) {
-                views.data.setTextDirection(entry.textDirection);
-            }
-        }
-
-        private void setMaxLines(TextView textView, int maxLines) {
-            if (maxLines == 1) {
-                textView.setSingleLine(true);
-                textView.setEllipsize(TextUtils.TruncateAt.END);
-            } else {
-                textView.setSingleLine(false);
-                textView.setMaxLines(maxLines);
-                textView.setEllipsize(null);
-            }
-        }
-
-        private final OnClickListener mPrimaryActionClickListener = new OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (mListener == null) return;
-                final ViewEntry entry = (ViewEntry) view.getTag();
-                if (entry == null) return;
-                entry.click(view, mListener);
-            }
-        };
-
-        private final OnClickListener mSecondaryActionClickListener = new OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (mListener == null) return;
-                if (view == null) return;
-                final ViewEntry entry = (ViewEntry) view.getTag();
-                if (entry == null || !(entry instanceof DetailViewEntry)) return;
-                final DetailViewEntry detailViewEntry = (DetailViewEntry) entry;
-                final Intent intent = detailViewEntry.secondaryIntent;
-                if (intent == null) return;
-                mListener.onItemClicked(intent);
-            }
-        };
-
-        @Override
-        public int getCount() {
-            return mAllEntries.size();
-        }
-
-        @Override
-        public ViewEntry getItem(int position) {
-            return mAllEntries.get(position);
-        }
-
-        @Override
-        public int getItemViewType(int position) {
-            return mAllEntries.get(position).getViewType();
-        }
-
-        @Override
-        public int getViewTypeCount() {
-            return VIEW_TYPE_COUNT;
-        }
-
-        @Override
-        public long getItemId(int position) {
-            final ViewEntry entry = mAllEntries.get(position);
-            if (entry != null) {
-                return entry.getId();
-            }
-            return -1;
-        }
-
-        @Override
-        public boolean areAllItemsEnabled() {
-            // Header will always be an item that is not enabled.
-            return false;
-        }
-
-        @Override
-        public boolean isEnabled(int position) {
-            return getItem(position).isEnabled();
-        }
-    }
-
-    @Override
-    public void onAccountSelectorCancelled() {
-    }
-
-    @Override
-    public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
-        createCopy(account);
-    }
-
-    private void createCopy(AccountWithDataSet account) {
-        if (mListener != null) {
-            mListener.onCreateRawContactRequested(mContactData.getContentValues(), account);
-        }
-    }
-
-    /**
-     * Default (fallback) list item click listener.  Note the click event for DetailViewEntry is
-     * caught by individual views in the list item view to distinguish the primary action and the
-     * secondary action, so this method won't be invoked for that.  (The listener is set in the
-     * bindview in the adapter)
-     * This listener is used for other kind of entries.
-     */
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        if (mListener == null) return;
-        final ViewEntry entry = mAdapter.getItem(position);
-        if (entry == null) return;
-        entry.click(view, mListener);
-    }
-
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
-        super.onCreateContextMenu(menu, view, menuInfo);
-
-        AdapterView.AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
-        DetailViewEntry selectedEntry = (DetailViewEntry) mAllEntries.get(info.position);
-
-        menu.setHeaderTitle(selectedEntry.data);
-        menu.add(ContextMenu.NONE, ContextMenuIds.COPY_TEXT,
-                ContextMenu.NONE, getString(R.string.copy_text));
-
-        // Don't allow setting or clearing of defaults for directory contacts
-        if (mContactData.isDirectoryEntry()) {
-            return;
-        }
-
-        String selectedMimeType = selectedEntry.mimetype;
-
-        // Defaults to true will only enable the detail to be copied to the clipboard.
-        boolean isUniqueMimeType = true;
-
-        // Only allow primary support for Phone and Email content types
-        if (Phone.CONTENT_ITEM_TYPE.equals(selectedMimeType)) {
-            isUniqueMimeType = mIsUniqueNumber;
-        } else if (Email.CONTENT_ITEM_TYPE.equals(selectedMimeType)) {
-            isUniqueMimeType = mIsUniqueEmail;
-        }
-
-        // Checking for previously set default
-        if (selectedEntry.isPrimary) {
-            menu.add(ContextMenu.NONE, ContextMenuIds.CLEAR_DEFAULT,
-                    ContextMenu.NONE, getString(R.string.clear_default));
-        } else if (!isUniqueMimeType) {
-            menu.add(ContextMenu.NONE, ContextMenuIds.SET_DEFAULT,
-                    ContextMenu.NONE, getString(R.string.set_default));
-        }
-    }
-
-    @Override
-    public boolean onContextItemSelected(MenuItem item) {
-        AdapterView.AdapterContextMenuInfo menuInfo;
-        try {
-            menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
-        } catch (ClassCastException e) {
-            Log.e(TAG, "bad menuInfo", e);
-            return false;
-        }
-
-        switch (item.getItemId()) {
-            case ContextMenuIds.COPY_TEXT:
-                copyToClipboard(menuInfo.position);
-                return true;
-            case ContextMenuIds.SET_DEFAULT:
-                setDefaultContactMethod(mListView.getItemIdAtPosition(menuInfo.position));
-                return true;
-            case ContextMenuIds.CLEAR_DEFAULT:
-                clearDefaultContactMethod(mListView.getItemIdAtPosition(menuInfo.position));
-                return true;
-            default:
-                throw new IllegalArgumentException("Unknown menu option " + item.getItemId());
-        }
-    }
-
-    private void setDefaultContactMethod(long id) {
-        Intent setIntent = ContactSaveService.createSetSuperPrimaryIntent(mContext, id);
-        mContext.startService(setIntent);
-    }
-
-    private void clearDefaultContactMethod(long id) {
-        Intent clearIntent = ContactSaveService.createClearPrimaryIntent(mContext, id);
-        mContext.startService(clearIntent);
-    }
-
-    private void copyToClipboard(int viewEntryPosition) {
-        // Getting the text to copied
-        DetailViewEntry detailViewEntry = (DetailViewEntry) mAllEntries.get(viewEntryPosition);
-        CharSequence textToCopy = detailViewEntry.data;
-
-        // Checking for empty string
-        if (TextUtils.isEmpty(textToCopy)) return;
-
-        ClipboardUtils.copyText(getActivity(), detailViewEntry.typeString, textToCopy, true);
-    }
-
-    @Override
-    public boolean handleKeyDown(int keyCode) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_CALL: {
-                TelephonyManager telephonyManager =
-                    (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
-                if (telephonyManager != null &&
-                        telephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
-                    // Skip out and let the key be handled at a higher level
-                    break;
-                }
-
-                int index = mListView.getSelectedItemPosition();
-                if (index != -1) {
-                    final DetailViewEntry entry = (DetailViewEntry) mAdapter.getItem(index);
-                    if (entry != null && entry.intent != null &&
-                            entry.intent.getAction() == Intent.ACTION_CALL_PRIVILEGED) {
-                        mContext.startActivity(entry.intent);
-                        return true;
-                    }
-                } else if (mPrimaryPhoneUri != null) {
-                    // There isn't anything selected, call the default number
-                    mContext.startActivity(CallUtil.getCallIntent(mPrimaryPhoneUri));
-                    return true;
-                }
-                return false;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Base class for QuickFixes. QuickFixes quickly fix issues with the Contact without
-     * requiring the user to go to the editor. Example: Add to My Contacts.
-     */
-    private static abstract class QuickFix {
-        public abstract boolean isApplicable();
-        public abstract String getTitle();
-        public abstract void execute();
-    }
-
-    private class AddToMyContactsQuickFix extends QuickFix {
-        @Override
-        public boolean isApplicable() {
-            // Only local contacts
-            if (mContactData == null || mContactData.isDirectoryEntry()) return false;
-
-            // User profile cannot be added to contacts
-            if (mContactData.isUserProfile()) return false;
-
-            // Only if exactly one raw contact
-            if (mContactData.getRawContacts().size() != 1) return false;
-
-            // test if the default group is assigned
-            final List<GroupMetaData> groups = mContactData.getGroupMetaData();
-
-            // For accounts without group support, groups is null
-            if (groups == null) return false;
-
-            // remember the default group id. no default group? bail out early
-            final long defaultGroupId = getDefaultGroupId(groups);
-            if (defaultGroupId == -1) return false;
-
-            final RawContact rawContact = mContactData.getRawContacts().get(0);
-            final AccountType type = rawContact.getAccountType(getContext());
-            // Offline or non-writeable account? Nothing to fix
-            if (type == null || !type.areContactsWritable()) return false;
-
-            // Check whether the contact is in the default group
-            boolean isInDefaultGroup = false;
-            for (DataItem dataItem : Iterables.filter(
-                    rawContact.getDataItems(), GroupMembershipDataItem.class)) {
-                GroupMembershipDataItem groupMembership = (GroupMembershipDataItem) dataItem;
-                final Long groupId = groupMembership.getGroupRowId();
-                if (groupId != null && groupId == defaultGroupId) {
-                    isInDefaultGroup = true;
-                    break;
-                }
-            }
-
-            return !isInDefaultGroup;
-        }
-
-        @Override
-        public String getTitle() {
-            return getString(R.string.add_to_my_contacts);
-        }
-
-        @Override
-        public void execute() {
-            final long defaultGroupId = getDefaultGroupId(mContactData.getGroupMetaData());
-            // there should always be a default group (otherwise the button would be invisible),
-            // but let's be safe here
-            if (defaultGroupId == -1) return;
-
-            // add the group membership to the current state
-            final RawContactDeltaList contactDeltaList = mContactData.createRawContactDeltaList();
-            final RawContactDelta rawContactEntityDelta = contactDeltaList.get(0);
-
-            final AccountTypeManager accountTypes = AccountTypeManager.getInstance(mContext);
-            final AccountType type = rawContactEntityDelta.getAccountType(accountTypes);
-            final DataKind groupMembershipKind = type.getKindForMimetype(
-                    GroupMembership.CONTENT_ITEM_TYPE);
-            final ValuesDelta entry = RawContactModifier.insertChild(rawContactEntityDelta,
-                    groupMembershipKind);
-            if (entry == null) return;
-            entry.setGroupRowId(defaultGroupId);
-
-            // and fire off the intent. we don't need a callback, as the database listener
-            // should update the ui
-            final Intent intent = ContactSaveService.createSaveContactIntent(getActivity(),
-                    contactDeltaList, "", 0, false, getActivity().getClass(),
-                    Intent.ACTION_VIEW, null);
-            getActivity().startService(intent);
-        }
-    }
-
-    private class MakeLocalCopyQuickFix extends QuickFix {
-        @Override
-        public boolean isApplicable() {
-            // Not a directory contact? Nothing to fix here
-            if (mContactData == null || !mContactData.isDirectoryEntry()) return false;
-
-            // No export support? Too bad
-            if (mContactData.getDirectoryExportSupport() == Directory.EXPORT_SUPPORT_NONE) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public String getTitle() {
-            return getString(R.string.menu_copyContact);
-        }
-
-        @Override
-        public void execute() {
-            if (mListener == null) {
-                return;
-            }
-
-            int exportSupport = mContactData.getDirectoryExportSupport();
-            switch (exportSupport) {
-                case Directory.EXPORT_SUPPORT_SAME_ACCOUNT_ONLY: {
-                    createCopy(new AccountWithDataSet(mContactData.getDirectoryAccountName(),
-                                    mContactData.getDirectoryAccountType(), null));
-                    break;
-                }
-                case Directory.EXPORT_SUPPORT_ANY_ACCOUNT: {
-                    final List<AccountWithDataSet> accounts =
-                            AccountTypeManager.getInstance(mContext).getAccounts(true);
-                    if (accounts.isEmpty()) {
-                        createCopy(null);
-                        return;  // Don't show a dialog.
-                    }
-
-                    // In the common case of a single writable account, auto-select
-                    // it without showing a dialog.
-                    if (accounts.size() == 1) {
-                        createCopy(accounts.get(0));
-                        return;  // Don't show a dialog.
-                    }
-
-                    SelectAccountDialogFragment.show(getFragmentManager(),
-                            ContactDetailFragment.this, R.string.dialog_new_contact_account,
-                            AccountListFilter.ACCOUNTS_CONTACT_WRITABLE, null);
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * This class loads the correct padding values for a contact detail item so they can be applied
-     * dynamically. For example, this supports the case where some detail items can be indented and
-     * need extra padding.
-     */
-    private static class ViewEntryDimensions {
-
-        private final int mWidePaddingLeft;
-        private final int mPaddingLeft;
-        private final int mPaddingRight;
-        private final int mPaddingTop;
-        private final int mPaddingBottom;
-
-        public ViewEntryDimensions(Resources resources) {
-            mPaddingLeft = resources.getDimensionPixelSize(
-                    R.dimen.detail_item_side_margin);
-            mPaddingTop = resources.getDimensionPixelSize(
-                    R.dimen.detail_item_vertical_margin);
-            mWidePaddingLeft = mPaddingLeft +
-                    resources.getDimensionPixelSize(R.dimen.detail_item_icon_margin) +
-                    resources.getDimensionPixelSize(R.dimen.detail_network_icon_size);
-            mPaddingRight = mPaddingLeft;
-            mPaddingBottom = mPaddingTop;
-        }
-
-        public int getWidePaddingLeft() {
-            return mWidePaddingLeft;
-        }
-
-        public int getPaddingLeft() {
-            return mPaddingLeft;
-        }
-
-        public int getPaddingRight() {
-            return mPaddingRight;
-        }
-
-        public int getPaddingTop() {
-            return mPaddingTop;
-        }
-
-        public int getPaddingBottom() {
-            return mPaddingBottom;
-        }
-    }
-
-    public static interface Listener {
-        /**
-         * User clicked a single item (e.g. mail). The intent passed in could be null.
-         */
-        public void onItemClicked(Intent intent);
-
-        /**
-         * User requested creation of a new contact with the specified values.
-         *
-         * @param values ContentValues containing data rows for the new contact.
-         * @param account Account where the new contact should be created.
-         */
-        public void onCreateRawContactRequested(ArrayList<ContentValues> values,
-                AccountWithDataSet account);
-    }
-
-    /**
-     * Adapter for the invitable account types; used for the invitable account type list popup.
-     */
-    private final static class InvitableAccountTypesAdapter extends BaseAdapter {
-        private final Context mContext;
-        private final LayoutInflater mInflater;
-        private final ArrayList<AccountType> mAccountTypes;
-
-        public InvitableAccountTypesAdapter(Context context, Contact contactData) {
-            mContext = context;
-            mInflater = LayoutInflater.from(context);
-            final List<AccountType> types = contactData.getInvitableAccountTypes();
-            mAccountTypes = new ArrayList<AccountType>(types.size());
-
-            for (int i = 0; i < types.size(); i++) {
-                mAccountTypes.add(types.get(i));
-            }
-
-            Collections.sort(mAccountTypes, new AccountType.DisplayLabelComparator(mContext));
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final View resultView =
-                    (convertView != null) ? convertView
-                    : mInflater.inflate(R.layout.account_selector_list_item, parent, false);
-
-            final TextView text1 = (TextView)resultView.findViewById(android.R.id.text1);
-            final TextView text2 = (TextView)resultView.findViewById(android.R.id.text2);
-            final ImageView icon = (ImageView)resultView.findViewById(android.R.id.icon);
-
-            final AccountType accountType = mAccountTypes.get(position);
-
-            CharSequence action = accountType.getInviteContactActionLabel(mContext);
-            CharSequence label = accountType.getDisplayLabel(mContext);
-            if (TextUtils.isEmpty(action)) {
-                text1.setText(label);
-                text2.setVisibility(View.GONE);
-            } else {
-                text1.setText(action);
-                text2.setVisibility(View.VISIBLE);
-                text2.setText(label);
-            }
-            icon.setImageDrawable(accountType.getDisplayIcon(mContext));
-
-            return resultView;
-        }
-
-        @Override
-        public int getCount() {
-            return mAccountTypes.size();
-        }
-
-        @Override
-        public AccountType getItem(int position) {
-            return mAccountTypes.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
deleted file mode 100644
index d563baf..0000000
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * 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.detail;
-
-import android.app.Activity;
-import android.app.FragmentManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.View;
-import android.view.ViewPropertyAnimator;
-
-import com.android.contacts.R.id;
-import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.util.UriUtils;
-
-/**
- * Sets ContactDetailFragment data and performs animations when data changes.
- *
- * TODO: rename, move some of this logic into ContactDetailFragment and/or delete this class. This
- * class used to have more responsibility: the ContactDetailFragment was used beside social update
- * Fragments.
- */
-public class ContactDetailLayoutController {
-
-    private static final String KEY_CONTACT_URI = "contactUri";
-
-    private final int SINGLE_PANE_FADE_IN_DURATION = 275;
-
-    private final Activity mActivity;
-    private final FragmentManager mFragmentManager;
-    private final ContactDetailFragment.Listener mContactDetailFragmentListener;
-    private final View mViewContainer;
-
-    private ContactDetailFragment mDetailFragment;
-    private Contact mContactData;
-    private Uri mContactUri;
-
-    public ContactDetailLayoutController(Activity activity, Bundle savedState,
-            FragmentManager fragmentManager, View viewContainer,
-            ContactDetailFragment.Listener contactDetailFragmentListener) {
-
-        if (fragmentManager == null) {
-            throw new IllegalStateException("Cannot initialize a ContactDetailLayoutController "
-                    + "without a non-null FragmentManager");
-        }
-
-        mActivity = activity;
-        mFragmentManager = fragmentManager;
-        mContactDetailFragmentListener = contactDetailFragmentListener;
-        mViewContainer = viewContainer;
-
-        initialize(savedState);
-    }
-
-    private void initialize(Bundle savedState) {
-        mDetailFragment = (ContactDetailFragment) mFragmentManager
-                .findFragmentById(id.contact_detail_about_fragment);
-
-        mDetailFragment.setListener(mContactDetailFragmentListener);
-
-        if (savedState != null) {
-            mContactUri = savedState.getParcelable(KEY_CONTACT_URI);
-
-            // Immediately setup layout since we have saved state
-            showContact();
-        }
-    }
-
-    public void setContactData(Contact data) {
-        final boolean contactWasLoaded;
-        final boolean isDifferentContact;
-        if (mContactData == null) {
-            contactWasLoaded = false;
-            isDifferentContact = true;
-        } else {
-            contactWasLoaded = true;
-            isDifferentContact =
-                    !UriUtils.areEqual(mContactData.getLookupUri(), data.getLookupUri());
-        }
-        mContactData = data;
-
-        // Small screen: We are on our own screen. Fade the data in, but only the first time
-        if (!contactWasLoaded) {
-            mViewContainer.setAlpha(0.0f);
-            final ViewPropertyAnimator animator = mViewContainer.animate();
-            animator.alpha(1.0f);
-            animator.setDuration(SINGLE_PANE_FADE_IN_DURATION);
-        }
-
-        showContact();
-    }
-
-    public void showEmptyState() {
-        mDetailFragment.setShowStaticPhoto(false);
-        mDetailFragment.showEmptyState();
-    }
-
-    private void showContact() {
-        if (mContactData == null) {
-            return;
-        }
-
-        Uri previousContactUri = mContactUri;
-        mContactUri = mContactData.getLookupUri();
-        boolean isDifferentContact = !UriUtils.areEqual(previousContactUri, mContactUri);
-
-        mDetailFragment.setShowStaticPhoto(true);
-
-        if (isDifferentContact) {
-            mDetailFragment.resetAdapter();
-        }
-
-        mDetailFragment.setData(mContactUri, mContactData);
-    }
-
-    public FragmentKeyListener getCurrentPage() {
-        return mDetailFragment;
-    }
-
-    public void onSaveInstanceState(Bundle outState) {
-        outState.putParcelable(KEY_CONTACT_URI, mContactUri);
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
deleted file mode 100644
index 1288cf7..0000000
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * 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.detail;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.LoaderManager;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.Loader;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.Contacts;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Toast;
-
-import com.android.contacts.ContactSaveService;
-import com.android.contacts.R;
-import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
-import com.android.contacts.common.list.ShortcutIntentBuilder;
-import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.model.ContactLoader;
-import com.android.contacts.util.PhoneCapabilityTester;
-import com.google.common.base.Objects;
-
-/**
- * This is an invisible worker {@link Fragment} that loads the contact details for the contact card.
- * The data is then passed to the listener, who can then pass the data to other {@link View}s.
- */
-public class ContactLoaderFragment extends Fragment implements FragmentKeyListener {
-
-    private static final String TAG = ContactLoaderFragment.class.getSimpleName();
-
-    /** The launch code when picking a ringtone */
-    private static final int REQUEST_CODE_PICK_RINGTONE = 1;
-
-    /** This is the Intent action to install a shortcut in the launcher. */
-    private static final String ACTION_INSTALL_SHORTCUT =
-            "com.android.launcher.action.INSTALL_SHORTCUT";
-
-    private boolean mOptionsMenuOptions;
-    private boolean mOptionsMenuEditable;
-    private boolean mOptionsMenuShareable;
-    private boolean mOptionsMenuCanCreateShortcut;
-    private boolean mSendToVoicemailState;
-    private String mCustomRingtone;
-
-    /**
-     * This is a listener to the {@link ContactLoaderFragment} and will be notified when the
-     * contact details have finished loading or if the user selects any menu options.
-     */
-    public static interface ContactLoaderFragmentListener {
-        /**
-         * Contact was not found, so somehow close this fragment. This is raised after a contact
-         * is removed via Menu/Delete
-         */
-        public void onContactNotFound();
-
-        /**
-         * Contact details have finished loading.
-         */
-        public void onDetailsLoaded(Contact result);
-
-        /**
-         * User decided to go to Edit-Mode
-         */
-        public void onEditRequested(Uri lookupUri);
-
-        /**
-         * User decided to delete the contact
-         */
-        public void onDeleteRequested(Uri lookupUri);
-
-    }
-
-    private static final int LOADER_DETAILS = 1;
-
-    private static final String KEY_CONTACT_URI = "contactUri";
-    private static final String LOADER_ARG_CONTACT_URI = "contactUri";
-
-    private Context mContext;
-    private Uri mLookupUri;
-    private ContactLoaderFragmentListener mListener;
-
-    private Contact mContactData;
-
-    public ContactLoaderFragment() {
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (savedInstanceState != null) {
-            mLookupUri = savedInstanceState.getParcelable(KEY_CONTACT_URI);
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putParcelable(KEY_CONTACT_URI, mLookupUri);
-    }
-
-    @Override
-    public void onAttach(Activity activity) {
-        super.onAttach(activity);
-        mContext = activity;
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
-        setHasOptionsMenu(true);
-        // This is an invisible view.  This fragment is declared in a layout, so it can't be
-        // "viewless".  (i.e. can't return null here.)
-        // See also the comment in the layout file.
-        return inflater.inflate(R.layout.contact_detail_loader_fragment, container, false);
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        if (mLookupUri != null) {
-            Bundle args = new Bundle();
-            args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri);
-            getLoaderManager().initLoader(LOADER_DETAILS, args, mDetailLoaderListener);
-        }
-    }
-
-    public void loadUri(Uri lookupUri) {
-        if (Objects.equal(lookupUri, mLookupUri)) {
-            // Same URI, no need to load the data again
-            return;
-        }
-
-        mLookupUri = lookupUri;
-        if (mLookupUri == null) {
-            getLoaderManager().destroyLoader(LOADER_DETAILS);
-            mContactData = null;
-            if (mListener != null) {
-                mListener.onDetailsLoaded(mContactData);
-            }
-        } else if (getActivity() != null) {
-            Bundle args = new Bundle();
-            args.putParcelable(LOADER_ARG_CONTACT_URI, mLookupUri);
-            getLoaderManager().restartLoader(LOADER_DETAILS, args, mDetailLoaderListener);
-        }
-    }
-
-    public void setListener(ContactLoaderFragmentListener value) {
-        mListener = value;
-    }
-
-    /**
-     * The listener for the detail loader
-     */
-    private final LoaderManager.LoaderCallbacks<Contact> mDetailLoaderListener =
-            new LoaderCallbacks<Contact>() {
-        @Override
-        public Loader<Contact> onCreateLoader(int id, Bundle args) {
-            Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI);
-            return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */,
-                    true /* load invitable account types */, true /* postViewNotification */,
-                    true /* computeFormattedPhoneNumber */);
-        }
-
-        @Override
-        public void onLoadFinished(Loader<Contact> loader, Contact data) {
-            if (!mLookupUri.equals(data.getRequestedUri())) {
-                Log.e(TAG, "Different URI: requested=" + mLookupUri + "  actual=" + data);
-                return;
-            }
-
-            if (data.isError()) {
-                // This shouldn't ever happen, so throw an exception. The {@link ContactLoader}
-                // should log the actual exception.
-                throw new IllegalStateException("Failed to load contact", data.getException());
-            } else if (data.isNotFound()) {
-                Log.i(TAG, "No contact found: " + ((ContactLoader)loader).getLookupUri());
-                mContactData = null;
-            } else {
-                mContactData = data;
-            }
-
-            if (mListener != null) {
-                if (mContactData == null) {
-                    mListener.onContactNotFound();
-                } else {
-                    mListener.onDetailsLoaded(mContactData);
-                }
-            }
-            // Make sure the options menu is setup correctly with the loaded data.
-            if (getActivity() != null) getActivity().invalidateOptionsMenu();
-        }
-
-        @Override
-        public void onLoaderReset(Loader<Contact> loader) {}
-    };
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, final MenuInflater inflater) {
-        inflater.inflate(R.menu.view_contact, menu);
-    }
-
-    public boolean isOptionsMenuChanged() {
-        return mOptionsMenuOptions != isContactOptionsChangeEnabled()
-                || mOptionsMenuEditable != isContactEditable()
-                || mOptionsMenuShareable != isContactShareable()
-                || mOptionsMenuCanCreateShortcut != isContactCanCreateShortcut();
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        mOptionsMenuOptions = isContactOptionsChangeEnabled();
-        mOptionsMenuEditable = isContactEditable();
-        mOptionsMenuShareable = isContactShareable();
-        mOptionsMenuCanCreateShortcut = isContactCanCreateShortcut();
-        if (mContactData != null) {
-            mSendToVoicemailState = mContactData.isSendToVoicemail();
-            mCustomRingtone = mContactData.getCustomRingtone();
-        }
-
-        // Hide telephony-related settings (ringtone, send to voicemail)
-        // if we don't have a telephone
-        final MenuItem optionsSendToVoicemail = menu.findItem(R.id.menu_send_to_voicemail);
-        if (optionsSendToVoicemail != null) {
-            optionsSendToVoicemail.setChecked(mSendToVoicemailState);
-            optionsSendToVoicemail.setVisible(mOptionsMenuOptions);
-        }
-        final MenuItem optionsRingtone = menu.findItem(R.id.menu_set_ringtone);
-        if (optionsRingtone != null) {
-            optionsRingtone.setVisible(mOptionsMenuOptions);
-        }
-
-        final MenuItem editMenu = menu.findItem(R.id.menu_edit);
-        if (editMenu != null) {
-            editMenu.setVisible(mOptionsMenuEditable);
-        }
-
-        final MenuItem deleteMenu = menu.findItem(R.id.menu_delete);
-        if (deleteMenu != null) {
-            deleteMenu.setVisible(mOptionsMenuEditable);
-        }
-
-        final MenuItem shareMenu = menu.findItem(R.id.menu_share);
-        if (shareMenu != null) {
-            shareMenu.setVisible(mOptionsMenuShareable);
-        }
-
-        final MenuItem createContactShortcutMenu = menu.findItem(R.id.menu_create_contact_shortcut);
-        if (createContactShortcutMenu != null) {
-            createContactShortcutMenu.setVisible(mOptionsMenuCanCreateShortcut);
-        }
-    }
-
-    public boolean isContactOptionsChangeEnabled() {
-        return mContactData != null && !mContactData.isDirectoryEntry()
-                && PhoneCapabilityTester.isPhone(mContext);
-    }
-
-    public boolean isContactEditable() {
-        return mContactData != null && !mContactData.isDirectoryEntry();
-    }
-
-    public boolean isContactShareable() {
-        return mContactData != null && !mContactData.isDirectoryEntry();
-    }
-
-    public boolean isContactCanCreateShortcut() {
-        return mContactData != null && !mContactData.isUserProfile()
-                && !mContactData.isDirectoryEntry();
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.menu_edit: {
-                if (mListener != null) mListener.onEditRequested(mLookupUri);
-                break;
-            }
-            case R.id.menu_delete: {
-                if (mListener != null) mListener.onDeleteRequested(mLookupUri);
-                return true;
-            }
-            case R.id.menu_set_ringtone: {
-                if (mContactData == null) return false;
-                doPickRingtone();
-                return true;
-            }
-            case R.id.menu_share: {
-                if (mContactData == null) return false;
-
-                final String lookupKey = mContactData.getLookupKey();
-                Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey);
-                if (mContactData.isUserProfile()) {
-                    // User is sharing the profile.  We don't want to force the receiver to have
-                    // the highly-privileged READ_PROFILE permission, so we need to request a
-                    // pre-authorized URI from the provider.
-                    shareUri = getPreAuthorizedUri(shareUri);
-                }
-
-                final Intent intent = new Intent(Intent.ACTION_SEND);
-                intent.setType(Contacts.CONTENT_VCARD_TYPE);
-                intent.putExtra(Intent.EXTRA_STREAM, shareUri);
-
-                // Launch chooser to share contact via
-                final CharSequence chooseTitle = mContext.getText(R.string.share_via);
-                final Intent chooseIntent = Intent.createChooser(intent, chooseTitle);
-
-                try {
-                    mContext.startActivity(chooseIntent);
-                } catch (ActivityNotFoundException ex) {
-                    Toast.makeText(mContext, R.string.share_error, Toast.LENGTH_SHORT).show();
-                }
-                return true;
-            }
-            case R.id.menu_send_to_voicemail: {
-                // Update state and save
-                mSendToVoicemailState = !mSendToVoicemailState;
-                item.setChecked(mSendToVoicemailState);
-                Intent intent = ContactSaveService.createSetSendToVoicemail(
-                        mContext, mLookupUri, mSendToVoicemailState);
-                mContext.startService(intent);
-                return true;
-            }
-            case R.id.menu_create_contact_shortcut: {
-                // Create a launcher shortcut with this contact
-                createLauncherShortcutWithContact();
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Creates a launcher shortcut with the current contact.
-     */
-    private void createLauncherShortcutWithContact() {
-        // Hold the parent activity of this fragment in case this fragment is destroyed
-        // before the callback to onShortcutIntentCreated(...)
-        final Activity parentActivity = getActivity();
-
-        ShortcutIntentBuilder builder = new ShortcutIntentBuilder(parentActivity,
-                new OnShortcutIntentCreatedListener() {
-
-            @Override
-            public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) {
-                // Broadcast the shortcutIntent to the launcher to create a
-                // shortcut to this contact
-                shortcutIntent.setAction(ACTION_INSTALL_SHORTCUT);
-                parentActivity.sendBroadcast(shortcutIntent);
-
-                // Send a toast to give feedback to the user that a shortcut to this
-                // contact was added to the launcher.
-                Toast.makeText(parentActivity,
-                        R.string.createContactShortcutSuccessful,
-                        Toast.LENGTH_SHORT).show();
-            }
-
-        });
-        builder.createContactShortcutIntent(mLookupUri);
-    }
-
-    /**
-     * Calls into the contacts provider to get a pre-authorized version of the given URI.
-     */
-    private Uri getPreAuthorizedUri(Uri uri) {
-        Bundle uriBundle = new Bundle();
-        uriBundle.putParcelable(ContactsContract.Authorization.KEY_URI_TO_AUTHORIZE, uri);
-        Bundle authResponse = mContext.getContentResolver().call(
-                ContactsContract.AUTHORITY_URI,
-                ContactsContract.Authorization.AUTHORIZATION_METHOD,
-                null,
-                uriBundle);
-        if (authResponse != null) {
-            return (Uri) authResponse.getParcelable(
-                    ContactsContract.Authorization.KEY_AUTHORIZED_URI);
-        } else {
-            return uri;
-        }
-    }
-
-    @Override
-    public boolean handleKeyDown(int keyCode) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_DEL: {
-                if (mListener != null) mListener.onDeleteRequested(mLookupUri);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private void doPickRingtone() {
-
-        Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
-        // Allow user to pick 'Default'
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
-        // Show only ringtones
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
-        // Allow the user to pick a silent ringtone
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
-
-        Uri ringtoneUri;
-        if (mCustomRingtone != null) {
-            ringtoneUri = Uri.parse(mCustomRingtone);
-        } else {
-            // Otherwise pick default ringtone Uri so that something is selected.
-            ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
-        }
-
-        // Put checkmark next to the current ringtone for this contact
-        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUri);
-
-        // Launch!
-        try {
-            startActivityForResult(intent, REQUEST_CODE_PICK_RINGTONE);
-        } catch (ActivityNotFoundException ex) {
-            Toast.makeText(mContext, R.string.missing_app, Toast.LENGTH_SHORT).show();
-        }
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (resultCode != Activity.RESULT_OK) {
-            return;
-        }
-
-        switch (requestCode) {
-            case REQUEST_CODE_PICK_RINGTONE: {
-                Uri pickedUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
-                handleRingtonePicked(pickedUri);
-                break;
-            }
-        }
-    }
-
-    private void handleRingtonePicked(Uri pickedUri) {
-        if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) {
-            mCustomRingtone = null;
-        } else {
-            mCustomRingtone = pickedUri.toString();
-        }
-        Intent intent = ContactSaveService.createSetRingtone(
-                mContext, mLookupUri, mCustomRingtone);
-        mContext.startService(intent);
-    }
-}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 669b460..43066d6 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -1107,6 +1107,9 @@
                     text = StructuredPostal.getTypeLabel(getResources(),
                             postal.getKindTypeColumn(kind), postal.getLabel()).toString();
                 }
+                alternateIntent =
+                        StructuredPostalUtils.getViewPostalAddressDirectionsIntent(postalAddress);
+                alternateIcon = getResources().getDrawable(R.drawable.ic_directions_24dp);
                 icon = getResources().getDrawable(R.drawable.ic_place_24dp);
             }
         } else if (dataItem instanceof SipAddressDataItem) {
@@ -1347,13 +1350,11 @@
             desiredStatusBarColor = Color.TRANSPARENT;
         }
         // Animate to the new color.
-        if (desiredStatusBarColor != getWindow().getStatusBarColor()) {
-            final ObjectAnimator animation = ObjectAnimator.ofInt(getWindow(), "statusBarColor",
-                    getWindow().getStatusBarColor(), desiredStatusBarColor);
-            animation.setDuration(ANIMATION_STATUS_BAR_COLOR_CHANGE_DURATION);
-            animation.setEvaluator(new ArgbEvaluator());
-            animation.start();
-        }
+        final ObjectAnimator animation = ObjectAnimator.ofInt(getWindow(), "statusBarColor",
+                getWindow().getStatusBarColor(), desiredStatusBarColor);
+        animation.setDuration(ANIMATION_STATUS_BAR_COLOR_CHANGE_DURATION);
+        animation.setEvaluator(new ArgbEvaluator());
+        animation.start();
     }
 
     private int colorFromBitmap(Bitmap bitmap) {
diff --git a/src/com/android/contacts/util/StructuredPostalUtils.java b/src/com/android/contacts/util/StructuredPostalUtils.java
index 59d38ea..6e46176 100644
--- a/src/com/android/contacts/util/StructuredPostalUtils.java
+++ b/src/com/android/contacts/util/StructuredPostalUtils.java
@@ -30,4 +30,12 @@
     public static Uri getPostalAddressUri(String postalAddress) {
         return Uri.parse("geo:0,0?q=" + Uri.encode(postalAddress));
     }
+
+    public static Intent getViewPostalAddressDirectionsIntent(String postalAddress) {
+        return new Intent(Intent.ACTION_VIEW, getPostalAddressDirectionsUri(postalAddress));
+    }
+
+    public static Uri getPostalAddressDirectionsUri(String postalAddress) {
+        return Uri.parse("https://maps.google.com/maps?daddr=" + Uri.encode(postalAddress));
+    }
 }
diff --git a/src/com/android/contacts/widget/MultiShrinkScroller.java b/src/com/android/contacts/widget/MultiShrinkScroller.java
index 22f1a9d..8f1146a 100644
--- a/src/com/android/contacts/widget/MultiShrinkScroller.java
+++ b/src/com/android/contacts/widget/MultiShrinkScroller.java
@@ -121,6 +121,7 @@
     private final int mMaximumTitleMargin;
     private final float mToolbarElevation;
     private final boolean mIsTwoPanel;
+    private final int mActionBarSize;
 
     // Objects used to perform color filtering on the header. These are stored as fields for
     // the sole purpose of avoiding "new" operations inside animation loops.
@@ -225,7 +226,8 @@
 
         final TypedArray attributeArray = context.obtainStyledAttributes(
                 new int[]{android.R.attr.actionBarSize});
-        mMinimumHeaderHeight = attributeArray.getDimensionPixelSize(0, 0);
+        mActionBarSize = attributeArray.getDimensionPixelSize(0, 0);
+        mMinimumHeaderHeight = mActionBarSize;
         // This value is approximately equal to the portrait ActionBar size. It isn't exactly the
         // same, since the landscape and portrait ActionBar sizes can be different.
         mMinimumPortraitHeaderHeight = mMinimumHeaderHeight;
@@ -303,7 +305,7 @@
         final FrameLayout.LayoutParams actionBarGradientLayoutParams
                 = (FrameLayout.LayoutParams) mActionBarGradientView.getLayoutParams();
         actionBarGradientLayoutParams.height
-                = (int) (mMinimumHeaderHeight * GRADIENT_SIZE_COEFFICIENT);
+                = (int) (mActionBarSize * GRADIENT_SIZE_COEFFICIENT);
         mActionBarGradientView.setLayoutParams(actionBarGradientLayoutParams);
         final FrameLayout.LayoutParams titleGradientLayoutParams
                 = (FrameLayout.LayoutParams) mTitleGradientView.getLayoutParams();
@@ -690,20 +692,23 @@
 
         if (!mEdgeGlowBottom.isFinished()) {
             final int restoreCount = canvas.save();
-            final int width = getWidth() - getPaddingStart() - getPaddingEnd();
+            final int width = getWidth() - getPaddingLeft() - getPaddingRight();
             final int height = getHeight();
 
             // Draw the EdgeEffect on the bottom of the Window (Or a little bit below the bottom
             // of the Window if we start to scroll upwards while EdgeEffect is visible). This
             // does not need to consider the case where this MultiShrinkScroller doesn't fill
             // the Window, since the nested ScrollView should be set to fillViewport.
-            canvas.translate(-width + getPaddingStart(),
+            canvas.translate(-width + getPaddingLeft(),
                     height + getMaximumScrollUpwards() - getScroll());
 
             canvas.rotate(180, width, 0);
             if (mIsTwoPanel) {
                 // Only show the EdgeEffect on the bottom of the ScrollView.
                 mEdgeGlowBottom.setSize(mScrollView.getWidth(), height);
+                if (isLayoutRtl()) {
+                    canvas.translate(mPhotoViewContainer.getWidth(), 0);
+                }
             } else {
                 mEdgeGlowBottom.setSize(width, height);
             }
@@ -907,6 +912,14 @@
         // available.
         Trace.beginSection("updatePhotoTintAndDropShadow");
 
+        if (mIsTwoPanel && !mPhotoView.isBasedOffLetterTile()) {
+            // When in two panel mode, UX considers photo tinting unnecessary for non letter
+            // tile photos.
+            mTitleGradientDrawable.setAlpha(0xFF);
+            mActionBarGradientDrawable.setAlpha(0xFF);
+            return;
+        }
+
         // We need to use toolbarLayoutParams to determine the height, since the layout
         // params can be updated before the height change is reflected inside the View#getHeight().
         final int toolbarHeight = mToolbar.getLayoutParams().height;
diff --git a/tests/src/com/android/contacts/ContactDetailTest.java b/tests/src/com/android/contacts/ContactDetailTest.java
deleted file mode 100644
index ea1e40e..0000000
--- a/tests/src/com/android/contacts/ContactDetailTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 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 android.test.ActivityUnitTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.contacts.activities.ContactDetailActivity;
-import com.android.contacts.common.test.mocks.ContactsMockContext;
-import com.android.contacts.common.test.mocks.MockContentProvider;
-
-@SmallTest
-public class ContactDetailTest extends ActivityUnitTestCase<ContactDetailActivity> {
-    private ContactsMockContext mContext;
-    private MockContentProvider mContactsProvider;
-
-    public ContactDetailTest() {
-        super(ContactDetailActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mContext = new ContactsMockContext(getInstrumentation().getTargetContext());
-        mContactsProvider = mContext.getContactsProvider();
-        setActivityContext(mContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-//    public void testFoo() {
-//        // Use lookup-style Uris that also contain the Contact-ID
-//        //long rawContactId1 = mCreator.createRawContact("JohnDoe", "John", "Doe");
-//        //long contactId1 = mCreator.getContactIdByRawContactId(rawContactId1);
-//        //Uri contactUri1 = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId1);
-//        Intent intent = new Intent(Intent.ACTION_VIEW,
-//                ContentUris.withAppendedId(Contacts.CONTENT_URI, 123));
-//        startActivity(intent, null, null);
-//        ContactDetailActivity activity = getActivity();
-//        mContactsProvider.verify();
-//    }
-}
diff --git a/tests/src/com/android/contacts/activities/PeopleActivityTest.java b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
index 88585c5..a9eac20 100644
--- a/tests/src/com/android/contacts/activities/PeopleActivityTest.java
+++ b/tests/src/com/android/contacts/activities/PeopleActivityTest.java
@@ -40,7 +40,6 @@
 import com.android.contacts.common.test.mocks.ContactsMockContext;
 import com.android.contacts.common.test.mocks.MockContentProvider;
 import com.android.contacts.common.test.mocks.MockContentProvider.Query;
-import com.android.contacts.detail.ContactDetailFragment;
 import com.android.contacts.interactions.TestLoaderManager;
 import com.android.contacts.list.ContactBrowseListFragment;
 import com.android.contacts.common.model.AccountTypeManager;