Remove ContactDetailLayoutController's social code

Prior to this change, the ContactDetailLayoutController
used ViewPagers and Carousels to display nothing but the
ContactDetailFragment. Originally these ViewPagers and carousels
were used to display social code.

I have removed the now useless ViewPagers, carousels and adapters.

Now that ContactDetailLayoutController's layout only contains
the ContactDetailFragment, there is no need for multiple different
ContactDetailLayoutController layouts.

Change-Id: Iea09bab7e39cfafded56be5c2302f3e36fd40f4c
diff --git a/res/layout-land/contact_detail_container.xml b/res/layout-land/contact_detail_container.xml
deleted file mode 100644
index fc401b7..0000000
--- a/res/layout-land/contact_detail_container.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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <com.android.contacts.detail.ContactDetailFragmentCarousel
-        android:id="@+id/fragment_carousel"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout-sw600dp-land/contact_detail_container.xml b/res/layout-sw600dp-land/contact_detail_container.xml
deleted file mode 100644
index 3597d9f..0000000
--- a/res/layout-sw600dp-land/contact_detail_container.xml
+++ /dev/null
@@ -1,28 +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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <com.android.contacts.detail.ContactDetailFragmentCarousel
-        android:id="@+id/fragment_carousel"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginLeft="16dip"
-        android:layout_marginStart="16dip"/>
-
-</FrameLayout>
diff --git a/res/layout-sw600dp-land/detail_header_contact_with_updates.xml b/res/layout-sw600dp-land/detail_header_contact_with_updates.xml
deleted file mode 100644
index 6476300..0000000
--- a/res/layout-sw600dp-land/detail_header_contact_with_updates.xml
+++ /dev/null
@@ -1,65 +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 has social updates. The
-  entry shows the contact's basic info and maintains vertical padding to ensure that the first
-  contact detail is visible (and below the tab carousel). The photo is not displayed here
-  because it will be shown in the tab carousel.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingBottom="8dip"
-    android:orientation="horizontal">
-
-    <include layout="@layout/photo_selector_view"
-        android:layout_width="@dimen/detail_contact_photo_size"
-        android:layout_height="@dimen/detail_contact_photo_size" />
-
-    <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:paddingLeft="16dip"
-        android:paddingRight="4dip"
-        android:paddingStart="16dip"
-        android:paddingEnd="4dip">
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/detail_header_name_text_size" />
-
-        <TextView
-            android:id="@+id/company"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="?android:attr/textColorSecondary" />
-
-    </LinearLayout>
-
-    <include
-        layout="@layout/favorites_star" />
-
-</LinearLayout>
diff --git a/res/layout-sw600dp/contact_detail_container.xml b/res/layout-sw600dp/contact_detail_container.xml
deleted file mode 100644
index d7accaf..0000000
--- a/res/layout-sw600dp/contact_detail_container.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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <android.support.v4.view.ViewPager
-        android:id="@+id/pager"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <include
-        android:id="@+id/tab_carousel"
-        layout="@layout/contact_detail_tab_carousel"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:visibility="gone"/>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/res/layout-sw600dp/detail_header_contact_with_updates.xml b/res/layout-sw600dp/detail_header_contact_with_updates.xml
deleted file mode 100644
index 06b82dd..0000000
--- a/res/layout-sw600dp/detail_header_contact_with_updates.xml
+++ /dev/null
@@ -1,77 +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. The
-  entry shows the contact's basic info and maintains vertical padding to ensure that the first
-  contact detail is visible (and below the tab carousel). The photo is not displayed here
-  because it will be shown in the tab carousel.
--->
-<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:layout_marginTop="30dip"
-    android:paddingBottom="16dip">
-
-    <!-- Add a first item that gives us enough space to show the carousel -->
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        ex:ratio="0.6667"
-        ex:direction="widthToHeight">
-
-        <!-- Put a dummy view here because the ProportionalLayout requires one -->
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-
-    </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-sw600dp/updates_header_contact.xml b/res/layout-sw600dp/updates_header_contact.xml
deleted file mode 100644
index e95f1dd..0000000
--- a/res/layout-sw600dp/updates_header_contact.xml
+++ /dev/null
@@ -1,58 +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 updates list.
--->
-<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">
-
-    <!-- This blank view pushes the other content down because of the tab carousel -->
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="8dip"
-        ex:ratio="0.6667"
-        ex:direction="widthToHeight">
-
-        <!-- Put a dummy view here because the ProportionalLayout requires one -->
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-
-    </view>
-
-    <!-- "Recent updates" header text -->
-    <TextView
-        style="?android:attr/listSeparatorTextViewStyle"
-        android:layout_height="32dip"
-        android:paddingLeft="8dip"
-        android:paddingRight="8dip"
-        android:paddingStart="8dip"
-        android:paddingEnd="8dip"
-        android:background="@drawable/list_section_divider_holo_custom"
-        android:text="@string/recent"
-        android:textColor="@color/people_app_theme_color"
-        android:textAllCaps="true"
-        android:singleLine="true"
-        android:ellipsize="end" />
-
-</LinearLayout>
diff --git a/res/layout-sw720dp-land/contact_detail_container.xml b/res/layout-sw720dp-land/contact_detail_container.xml
deleted file mode 100644
index 8180e92..0000000
--- a/res/layout-sw720dp-land/contact_detail_container.xml
+++ /dev/null
@@ -1,60 +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.
--->
-
-<!--
-  Two-column layout for a contact with social updates. If the contact does not
-  have social updates, then the second fragment container will just be hidden.
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:scrollbars="none"
-    android:orientation="horizontal"
-    android:baselineAligned="false">
-
-    <!--
-      Container for the "About" fragment on the contact card for a contact
-      with social updates. This view ID must match with a view ID in the layout
-      that is used after an orientation change.
-    -->
-    <FrameLayout
-        android:id="@+id/about_fragment_container"
-        android:layout_width="0dip"
-        android:layout_height="match_parent"
-        android:layout_weight="3" />
-
-    <!-- Vertical divider -->
-    <View
-        android:layout_width="2dip"
-        android:layout_height="match_parent"
-        android:background="?android:attr/listDivider"
-        />
-
-    <!--
-      Container for the "Updates" fragment on the contact card for a contact
-      with social updates. This view ID must match with a view ID in the layout
-      that is used after an orientation change.
-    -->
-    <FrameLayout
-        android:id="@+id/updates_fragment_container"
-        android:layout_width="0dip"
-        android:layout_weight="2"
-        android:layout_height="match_parent"
-        android:visibility="gone" />
-
-</LinearLayout>
diff --git a/res/layout-sw720dp-land/detail_header_contact_with_updates.xml b/res/layout-sw720dp-land/detail_header_contact_with_updates.xml
deleted file mode 100644
index 268b51a..0000000
--- a/res/layout-sw720dp-land/detail_header_contact_with_updates.xml
+++ /dev/null
@@ -1,63 +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. The
-  entry shows the contact's basic info and maintains vertical padding to ensure that the first
-  contact detail is visible (and below the tab carousel). The photo is not displayed here
-  because it will be shown in the tab carousel.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingBottom="8dip"
-    android:orientation="horizontal">
-
-    <include layout="@layout/photo_selector_view"
-        android:layout_width="@dimen/detail_contact_photo_size"
-        android:layout_height="@dimen/detail_contact_photo_size" />
-
-    <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:paddingStart="16dip"
-        android:paddingEnd="4dip">
-
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textSize="@dimen/detail_header_name_text_size" />
-
-        <TextView
-            android:id="@+id/company"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="?android:attr/textColorSecondary" />
-
-    </LinearLayout>
-
-    <include
-        layout="@layout/favorites_star" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/carousel_about_tab.xml b/res/layout/carousel_about_tab.xml
deleted file mode 100644
index 8026f37..0000000
--- a/res/layout/carousel_about_tab.xml
+++ /dev/null
@@ -1,80 +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
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.detail.CarouselTab"
-    android:layout_width="0dip"
-    android:layout_height="match_parent"
-    android:layout_weight="1">
-
-    <RelativeLayout
-        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"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"/>
-
-        <View android:id="@+id/photo_overlay"
-            android:background="?android:attr/selectableItemBackground"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"/>
-
-        <!-- Transparent view to overlay on the contact's photo
-        (to allow white text to appear over a white photo). -->
-        <View android:id="@+id/label_background"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentBottom="true"
-            android:background="#7F000000" />
-
-        <View
-            android:id="@+id/alpha_overlay"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentTop="true"
-            android:layout_marginBottom="@dimen/detail_tab_carousel_tab_label_height"/>
-
-        <TextView
-            android:id="@+id/label"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentBottom="true"
-            android:paddingLeft="@dimen/detail_tab_carousel_tab_label_indent"
-            android:paddingStart="@dimen/detail_tab_carousel_tab_label_indent"
-            android:singleLine="true"
-            android:gravity="left|center_vertical"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="@color/detail_tab_carousel_tab_label_color"
-            style="@android:style/Widget.Holo.ActionBar.TabView" />
-
-    </RelativeLayout>
-
-</view>
diff --git a/res/layout/carousel_updates_tab.xml b/res/layout/carousel_updates_tab.xml
deleted file mode 100644
index 0bd5cbd..0000000
--- a/res/layout/carousel_updates_tab.xml
+++ /dev/null
@@ -1,98 +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.
--->
-
-<!--
-  TODO: Collapse carousel_about_tab with carousel_updates_tab into 1 XML that
-  handles all cases when updates fragment is more finalized.
--->
-<view
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.detail.CarouselTab"
-    android:layout_width="0dip"
-    android:layout_height="match_parent"
-    android:layout_weight="1"
-    android:background="@drawable/bg_people_updates_holo">
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <ImageView android:id="@+id/status_photo"
-            android:scaleType="centerCrop"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:visibility="gone" />
-
-        <!-- Transparent view to overlay on the update photo
-        (to allow white text to appear over a white photo). -->
-        <View android:id="@+id/label_background"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentBottom="true"
-            android:layout_above="@id/status_photo"
-            android:background="#7F000000" />
-
-        <TextView android:id="@+id/status"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_above="@id/label"
-            android:gravity="center_vertical"
-            android:paddingLeft="@dimen/detail_update_tab_side_padding"
-            android:paddingRight="@dimen/detail_update_tab_side_padding"
-            android:paddingStart="@dimen/detail_update_tab_side_padding"
-            android:paddingEnd="@dimen/detail_update_tab_side_padding"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:textColor="@color/detail_update_tab_text_color"
-            android:textStyle="bold"
-            android:maxLines="@integer/updates_tab_snippet_max_lines"
-            android:ellipsize="end" />
-
-        <View
-            android:id="@+id/alpha_overlay"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentTop="true"
-            android:layout_marginBottom="@dimen/detail_tab_carousel_tab_label_height"/>
-
-        <TextView
-            android:id="@+id/label"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/detail_tab_carousel_tab_label_height"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentBottom="true"
-            android:layout_above="@id/status_photo"
-            android:paddingLeft="@dimen/detail_tab_carousel_tab_label_indent"
-            android:paddingStart="@dimen/detail_tab_carousel_tab_label_indent"
-            android:singleLine="true"
-            android:gravity="start|center_vertical"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="@color/detail_tab_carousel_tab_label_color"
-            style="@android:style/Widget.Holo.ActionBar.TabView" />
-
-    </RelativeLayout>
-
-</view>
diff --git a/res/layout/contact_detail_container.xml b/res/layout/contact_detail_container.xml
index f6b3438..910d684 100644
--- a/res/layout/contact_detail_container.xml
+++ b/res/layout/contact_detail_container.xml
@@ -14,35 +14,12 @@
      limitations under the License.
 -->
 
-<!--
-  Layout for the contact card page. If the contact has social updates, then
-  the ViewPager and ContactDetailTabCarousel are shown together. If there
-  aren't any social updates, then just the ContactDetailFragment will be
-  shown. We include all 3 views even though they are never shown
-  simultaneously because this layout is reused but set with different data
-  each time (i.e. on a tablet).
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<!-- 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">
-
-    <android.support.v4.view.ViewPager
-        android:id="@+id/pager"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-    <include
-        android:id="@+id/tab_carousel"
-        layout="@layout/contact_detail_tab_carousel"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:visibility="gone"/>
-
-</RelativeLayout>
\ No newline at end of file
+  <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_fragment_carousel.xml b/res/layout/contact_detail_fragment_carousel.xml
deleted file mode 100644
index 0695511..0000000
--- a/res/layout/contact_detail_fragment_carousel.xml
+++ /dev/null
@@ -1,54 +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:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:scrollbars="none"
-    android:orientation="horizontal"
-    android:baselineAligned="false">
-
-    <!--
-      Container for the "About" page fragment on the contact card for a contact
-      with social updates. This view ID must match with a view ID in the layout
-      that is used after an orientation change.
-    -->
-    <view
-        class="com.android.contacts.widget.FrameLayoutWithOverlay"
-        android:id="@+id/about_fragment_container"
-        android:layout_width="0dip"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:focusable="true"
-        android:focusableInTouchMode="true" />
-
-    <!--
-      Container for the "Updates" page fragment on the contact card for a contact
-      with social updates. This view ID must match with a view ID in the layout
-      that is used after an orientation change.
-    -->
-    <view
-        class="com.android.contacts.widget.FrameLayoutWithOverlay"
-        android:id="@+id/updates_fragment_container"
-        android:layout_width="0dip"
-        android:layout_height="match_parent"
-        android:layout_weight="1"
-        android:focusable="true"
-        android:focusableInTouchMode="true"
-        android:visibility="gone" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/contact_detail_tab_carousel.xml b/res/layout/contact_detail_tab_carousel.xml
deleted file mode 100644
index 711a6c3..0000000
--- a/res/layout/contact_detail_tab_carousel.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.
--->
-
-<view
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.contacts.detail.ContactDetailTabCarousel"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:scrollbars="none"
-    android:fadingEdge="none">
-
-    <LinearLayout
-        android:id="@+id/tab_and_shadow_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-
-        <LinearLayout
-            android:id="@+id/tab_container"
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            android:layout_weight="1"
-            android:orientation="horizontal"
-            android:baselineAligned="false">
-
-            <!-- "About" tab -->
-            <include
-                android:id="@+id/tab_about"
-                layout="@layout/carousel_about_tab" />
-
-            <!-- Vertical divider -->
-            <View
-                android:id="@+id/tab_divider"
-                android:layout_width="1dip"
-                android:layout_height="match_parent"
-                android:background="@android:color/white"/>
-
-            <!-- "Updates" tab -->
-            <include
-                android:id="@+id/tab_update"
-                layout="@layout/carousel_updates_tab" />
-
-        </LinearLayout>
-
-        <!--
-          Shadow below the carousel. The ContactDetailTabCarousel increases its height to
-          account for this shadow, and the class assumes the height of this shadow to be
-          @dimen/detail_contact_photo_shadow_height.
-        -->
-        <View
-            android:id="@+id/shadow"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/detail_contact_photo_shadow_height"
-            android:background="?android:attr/windowContentOverlay"/>
-
-    </LinearLayout>
-
-</view>
diff --git a/res/layout/detail_header_contact_with_updates.xml b/res/layout/detail_header_contact_with_updates.xml
deleted file mode 100644
index dc4cf8b..0000000
--- a/res/layout/detail_header_contact_with_updates.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.
--->
-
-<!--
-  This is a header entry in the contact details list for when the contact has social updates. The
-  entry maintains vertical padding to ensure that the first contact detail is visible (and below
-  the tab carousel). No information has to be displayed in this header.
-  The FrameLayout is used to apply additional padding which is needed for the shadow
--->
-<FrameLayout
-    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">
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/detail_contact_photo_shadow_height"
-        ex:ratio="0.5"
-        ex:direction="widthToHeight">
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-    </view>
-</FrameLayout>
diff --git a/res/layout/updates_header_contact.xml b/res/layout/updates_header_contact.xml
deleted file mode 100644
index 66cdac4..0000000
--- a/res/layout/updates_header_contact.xml
+++ /dev/null
@@ -1,68 +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 updates list.
--->
-<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">
-
-    <!-- This blank view pushes the other content down because of the tab carousel -->
-    <view
-        class="com.android.contacts.common.widget.ProportionalLayout"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/detail_contact_photo_shadow_height"
-        ex:ratio="0.5"
-        ex:direction="widthToHeight">
-
-        <!-- Put a dummy view here because the ProportionalLayout requires one -->
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-
-    </view>
-
-    <!-- "Recent" header text -->
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="32dip"
-        android:paddingLeft="16dip"
-        android:paddingRight="16dip"
-        android:paddingStart="16dip"
-        android:paddingEnd="16dip"
-        android:focusable="false">
-
-        <TextView
-            style="?android:attr/listSeparatorTextViewStyle"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip"
-            android:paddingStart="8dip"
-            android:paddingEnd="8dip"
-            android:background="@drawable/list_section_divider_holo_custom"
-            android:text="@string/recent"
-            android:textColor="@color/people_app_theme_color"
-            android:textAllCaps="true"
-            android:singleLine="true"
-            android:ellipsize="end" />
-
-    </FrameLayout>
-
-</LinearLayout>
diff --git a/res/values-sw600dp/donottranslate_config.xml b/res/values-sw600dp/donottranslate_config.xml
index a8d428c..bbf37c1 100644
--- a/res/values-sw600dp/donottranslate_config.xml
+++ b/res/values-sw600dp/donottranslate_config.xml
@@ -23,6 +23,4 @@
     <bool name="show_home_icon">true</bool>
     <bool name="config_browse_list_show_images">false</bool>
     <bool name="config_browse_list_reverse_images">false</bool>
-    <item name="tab_width_screen_width_percentage" type="fraction">66.67%</item>
-    <item name="tab_height_screen_width_percentage" type="fraction">66.67%</item>
 </resources>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index b74d8ce..dcf3039 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -47,14 +47,6 @@
     -->
     <bool name="config_show_group_action_in_action_bar">false</bool>
 
-    <!-- Width of a tab in the tab carousel as a percentage of the current screen width on the
-         contact detail page -->
-    <item name="tab_width_screen_width_percentage" type="fraction">75%</item>
-
-    <!-- Height of the tab carousel as a percentage of the current screen width on the
-         contact detail page -->
-    <item name="tab_height_screen_width_percentage" type="fraction">50%</item>
-
     <!-- Help URL pointing to main TOC for People. This is intentionally empty because
          the overlay will fill this in during build time. -->
     <string name="help_url_people_main"></string>
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index aa4cdf7..a117f5e 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -55,7 +55,6 @@
 import com.android.contacts.activities.ActionBarAdapter.TabState;
 import com.android.contacts.detail.ContactDetailFragment;
 import com.android.contacts.detail.ContactDetailLayoutController;
-import com.android.contacts.detail.ContactDetailUpdatesFragment;
 import com.android.contacts.detail.ContactLoaderFragment;
 import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
 import com.android.contacts.common.ContactsUtils;
@@ -239,7 +238,7 @@
      * However, there are special fragments which may not be in the layout, so we have to do the
      * initialization here.
      * The target fragments are:
-     * - {@link ContactDetailFragment} and {@link ContactDetailUpdatesFragment}:  They may not be
+     * - {@link ContactDetailFragment}: This may not be available
      *   in the layout depending on the configuration.  (i.e. portrait)
      * - {@link ContactsUnavailableFragment}: We always create it at runtime.
      */
diff --git a/src/com/android/contacts/detail/CarouselTab.java b/src/com/android/contacts/detail/CarouselTab.java
deleted file mode 100644
index 09e097a..0000000
--- a/src/com/android/contacts/detail/CarouselTab.java
+++ /dev/null
@@ -1,86 +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.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewPropertyAnimator;
-import android.widget.TextView;
-
-import com.android.contacts.R;
-import com.android.contacts.widget.FrameLayoutWithOverlay;
-
-/**
- * This is a tab in the {@link ContactDetailTabCarousel}.
- */
-public class CarouselTab extends FrameLayoutWithOverlay {
-
-    private static final String TAG = CarouselTab.class.getSimpleName();
-
-    private static final long FADE_TRANSITION_TIME = 150;
-
-    private TextView mLabelView;
-    private View mLabelBackgroundView;
-
-    /**
-     * This view adds an alpha layer over the entire tab (except for the label).
-     */
-    private View mAlphaLayer;
-
-    public CarouselTab(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mLabelView = (TextView) findViewById(R.id.label);
-        mLabelBackgroundView = findViewById(R.id.label_background);
-        mAlphaLayer = findViewById(R.id.alpha_overlay);
-        setAlphaLayer(mAlphaLayer);
-    }
-
-    public void setLabel(String label) {
-        mLabelView.setText(label);
-    }
-
-    public void showSelectedState() {
-        mLabelView.setSelected(true);
-    }
-
-    public void showDeselectedState() {
-        mLabelView.setSelected(false);
-    }
-
-    public void fadeInLabelViewAnimator(int startDelay, boolean fadeBackground) {
-        final ViewPropertyAnimator labelAnimator = mLabelView.animate();
-        mLabelView.setAlpha(0.0f);
-        labelAnimator.alpha(1.0f);
-        labelAnimator.setStartDelay(startDelay);
-        labelAnimator.setDuration(FADE_TRANSITION_TIME);
-
-        if (fadeBackground) {
-            final ViewPropertyAnimator backgroundAnimator = mLabelBackgroundView.animate();
-            mLabelBackgroundView.setAlpha(0.0f);
-            backgroundAnimator.alpha(1.0f);
-            backgroundAnimator.setStartDelay(startDelay);
-            backgroundAnimator.setDuration(FADE_TRANSITION_TIME);
-        }
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 629e36b..6573fa2 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -161,7 +161,6 @@
 
     private Button mQuickFixButton;
     private QuickFix mQuickFix;
-    private boolean mContactHasSocialUpdates;
     private boolean mShowStaticPhoto = true;
 
     private final QuickFix[] mPotentialQuickFixes = new QuickFix[] {
diff --git a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
deleted file mode 100644
index 434d8f5..0000000
--- a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
+++ /dev/null
@@ -1,298 +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.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewPropertyAnimator;
-import android.widget.HorizontalScrollView;
-
-import com.android.contacts.R;
-import com.android.contacts.widget.FrameLayoutWithOverlay;
-
-/**
- * This is a horizontally scrolling carousel with 2 fragments: one to see info about the contact and
- * one to see updates from the contact. Depending on the scroll position and user selection of which
- * fragment to currently view, the touch interceptors over each fragment are configured accordingly.
- */
-public class ContactDetailFragmentCarousel extends HorizontalScrollView implements OnTouchListener {
-
-    private static final String TAG = ContactDetailFragmentCarousel.class.getSimpleName();
-
-    /**
-     * Number of pixels that this view can be scrolled horizontally.
-     */
-    private int mAllowedHorizontalScrollLength = Integer.MIN_VALUE;
-
-    /**
-     * Minimum X scroll position that must be surpassed (if the user is on the "about" page of the
-     * contact card), in order for this view to automatically snap to the "updates" page.
-     */
-    private int mLowerThreshold = Integer.MIN_VALUE;
-
-    /**
-     * Maximum X scroll position (if the user is on the "updates" page of the contact card), below
-     * which this view will automatically snap to the "about" page.
-     */
-    private int mUpperThreshold = Integer.MIN_VALUE;
-
-    /**
-     * Minimum width of a fragment (if there is more than 1 fragment in the carousel, then this is
-     * the width of one of the fragments).
-     */
-    private int mMinFragmentWidth = Integer.MIN_VALUE;
-
-    /**
-     * Fragment width (if there are 1+ fragments in the carousel) as defined as a fraction of the
-     * screen width.
-     */
-    private static final float FRAGMENT_WIDTH_SCREEN_WIDTH_FRACTION = 0.85f;
-
-    private static final int ABOUT_PAGE = 0;
-    private static final int UPDATES_PAGE = 1;
-
-    private static final int MAX_FRAGMENT_VIEW_COUNT = 2;
-
-    private boolean mEnableSwipe;
-
-    private int mCurrentPage = ABOUT_PAGE;
-    private int mLastScrollPosition;
-
-    private FrameLayoutWithOverlay mAboutFragment;
-    private FrameLayoutWithOverlay mUpdatesFragment;
-
-    public ContactDetailFragmentCarousel(Context context) {
-        this(context, null);
-    }
-
-    public ContactDetailFragmentCarousel(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ContactDetailFragmentCarousel(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        final LayoutInflater inflater =
-                (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        inflater.inflate(R.layout.contact_detail_fragment_carousel, this);
-
-        setOnTouchListener(this);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int screenWidth = MeasureSpec.getSize(widthMeasureSpec);
-        int screenHeight = MeasureSpec.getSize(heightMeasureSpec);
-
-        // Take the width of this view as the width of the screen and compute necessary thresholds.
-        // Only do this computation 1x.
-        if (mAllowedHorizontalScrollLength == Integer.MIN_VALUE) {
-            mMinFragmentWidth = (int) (FRAGMENT_WIDTH_SCREEN_WIDTH_FRACTION * screenWidth);
-            mAllowedHorizontalScrollLength = (MAX_FRAGMENT_VIEW_COUNT * mMinFragmentWidth) -
-                    screenWidth;
-            mLowerThreshold = (screenWidth - mMinFragmentWidth) / MAX_FRAGMENT_VIEW_COUNT;
-            mUpperThreshold = mAllowedHorizontalScrollLength - mLowerThreshold;
-        }
-
-        if (getChildCount() > 0) {
-            View child = getChildAt(0);
-            // If we enable swipe, then the {@link LinearLayout} child width must be the sum of the
-            // width of all its children fragments.
-            // Or the current page may already be set to something other than the first.  If so,
-            // it also means there are multiple child fragments.
-            if (mEnableSwipe || mCurrentPage == 1 ||
-                    (mCurrentPage == 0 && getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)) {
-                child.measure(MeasureSpec.makeMeasureSpec(
-                        mMinFragmentWidth * MAX_FRAGMENT_VIEW_COUNT, MeasureSpec.EXACTLY),
-                        MeasureSpec.makeMeasureSpec(screenHeight, MeasureSpec.EXACTLY));
-            } else {
-                // Otherwise, the {@link LinearLayout} child width will just be the screen width
-                // because it will only have 1 child fragment.
-                child.measure(MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.EXACTLY),
-                        MeasureSpec.makeMeasureSpec(screenHeight, MeasureSpec.EXACTLY));
-            }
-        }
-
-        setMeasuredDimension(
-                resolveSize(screenWidth, widthMeasureSpec),
-                resolveSize(screenHeight, heightMeasureSpec));
-    }
-
-    /**
-     * Set the current page. This dims out the non-selected page but doesn't do any scrolling of
-     * the carousel.
-     */
-    public void setCurrentPage(int pageIndex) {
-        mCurrentPage = pageIndex;
-
-        updateTouchInterceptors();
-    }
-
-    /**
-     * Set the view containers for the detail and updates fragment.
-     */
-    public void setFragmentViews(FrameLayoutWithOverlay about, FrameLayoutWithOverlay updates) {
-        mAboutFragment = about;
-        mUpdatesFragment = updates;
-
-        mAboutFragment.setOverlayOnClickListener(mAboutFragTouchInterceptListener);
-        mUpdatesFragment.setOverlayOnClickListener(mUpdatesFragTouchInterceptListener);
-    }
-
-    /**
-     * Enable swiping if the detail and update fragments should be showing. Otherwise disable
-     * swiping if only the detail fragment should be showing.
-     */
-    public void enableSwipe(boolean enable) {
-        if (mEnableSwipe != enable) {
-            mEnableSwipe = enable;
-            if (mUpdatesFragment != null) {
-                mUpdatesFragment.setVisibility(enable ? View.VISIBLE : View.GONE);
-                snapToEdge();
-                updateTouchInterceptors();
-            }
-        }
-    }
-
-    /**
-     * Reset the fragment carousel to show the about page.
-     */
-    public void reset() {
-        if (mCurrentPage != ABOUT_PAGE) {
-            mCurrentPage = ABOUT_PAGE;
-            snapToEdgeSmooth();
-        }
-    }
-
-    public int getCurrentPage() {
-        return mCurrentPage;
-    }
-
-    private final OnClickListener mAboutFragTouchInterceptListener = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mCurrentPage = ABOUT_PAGE;
-            snapToEdgeSmooth();
-        }
-    };
-
-    private final OnClickListener mUpdatesFragTouchInterceptListener = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mCurrentPage = UPDATES_PAGE;
-            snapToEdgeSmooth();
-        }
-    };
-
-    private void updateTouchInterceptors() {
-        // Disable the touch-interceptor on the selected page, and enable it on the other.
-        if (mAboutFragment != null) {
-            mAboutFragment.setOverlayClickable(mCurrentPage != ABOUT_PAGE);
-        }
-        if (mUpdatesFragment != null) {
-            mUpdatesFragment.setOverlayClickable(mCurrentPage != UPDATES_PAGE);
-        }
-    }
-
-    @Override
-    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
-        super.onScrollChanged(l, t, oldl, oldt);
-        if (!mEnableSwipe) {
-            return;
-        }
-        mLastScrollPosition = l;
-    }
-
-    /**
-     * Used to set initial scroll offset.  Not smooth.
-     */
-    private void snapToEdge() {
-        setScrollX(calculateHorizontalOffset());
-        updateTouchInterceptors();
-    }
-
-    /**
-     * Smooth version of snapToEdge().
-     */
-    private void snapToEdgeSmooth() {
-        smoothScrollTo(calculateHorizontalOffset(), 0);
-        updateTouchInterceptors();
-    }
-
-    private int calculateHorizontalOffset() {
-        int offset;
-        if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
-            offset = (mCurrentPage == ABOUT_PAGE) ? mAllowedHorizontalScrollLength : 0;
-        } else {
-            offset = (mCurrentPage == ABOUT_PAGE) ? 0 : mAllowedHorizontalScrollLength;
-        }
-        return offset;
-    }
-
-    /**
-     * Returns the desired page we should scroll to based on the current X scroll position and the
-     * current page.
-     */
-    private int getDesiredPage() {
-        switch (mCurrentPage) {
-            case ABOUT_PAGE:
-                if (getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) {
-                    // If the user is on the "about" page, and the scroll position exceeds the lower
-                    // threshold, then we should switch to the "updates" page.
-                    return (mLastScrollPosition > mLowerThreshold) ? UPDATES_PAGE : ABOUT_PAGE;
-                } else {
-                    return (mLastScrollPosition < mUpperThreshold) ? UPDATES_PAGE : ABOUT_PAGE;
-                }
-            case UPDATES_PAGE:
-                if (getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) {
-                    // If the user is on the "updates" page, and the scroll position goes below the
-                    // upper threshold, then we should switch to the "about" page.
-                    return (mLastScrollPosition < mUpperThreshold) ? ABOUT_PAGE : UPDATES_PAGE;
-                } else {
-                    return (mLastScrollPosition > mLowerThreshold) ? ABOUT_PAGE : UPDATES_PAGE;
-                }
-        }
-        throw new IllegalStateException("Invalid current page " + mCurrentPage);
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        if (!mEnableSwipe) {
-            return false;
-        }
-        if (event.getAction() == MotionEvent.ACTION_UP) {
-            mCurrentPage = getDesiredPage();
-            snapToEdgeSmooth();
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Starts an "appear" animation by moving in the "Updates" from the right.
-     */
-    public void animateAppear() {
-        final int x = Math.round((1.0f - FRAGMENT_WIDTH_SCREEN_WIDTH_FRACTION) * getWidth());
-        mUpdatesFragment.setTranslationX(x);
-        final ViewPropertyAnimator animator = mUpdatesFragment.animate();
-        animator.translationX(0.0f);
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index 1ee31a5..7e412e0 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -16,101 +16,44 @@
 
 package com.android.contacts.detail;
 
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.ObjectAnimator;
 import android.app.Activity;
 import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.content.Context;
 import android.net.Uri;
 import android.os.Bundle;
-import android.support.v4.view.ViewPager;
-import android.support.v4.view.ViewPager.OnPageChangeListener;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
-import android.view.animation.AnimationUtils;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
 
 import com.android.contacts.NfcHandler;
-import com.android.contacts.R;
+import com.android.contacts.R.id;
 import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.util.PhoneCapabilityTester;
 import com.android.contacts.common.util.UriUtils;
-import com.android.contacts.widget.FrameLayoutWithOverlay;
 import com.android.contacts.widget.TransitionAnimationView;
 
 /**
- * Determines the layout of the contact card.
+ * 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 static final String KEY_CONTACT_HAS_UPDATES = "contactHasUpdates";
-    private static final String KEY_CURRENT_PAGE_INDEX = "currentPageIndex";
-
-    private static final int TAB_INDEX_DETAIL = 0;
-    private static final int TAB_INDEX_UPDATES = 1;
 
     private final int SINGLE_PANE_FADE_IN_DURATION = 275;
 
-    /**
-     * There are 4 possible layouts for the contact detail screen: TWO_COLUMN,
-     * VIEW_PAGER_AND_TAB_CAROUSEL, FRAGMENT_CAROUSEL, and TWO_COLUMN_FRAGMENT_CAROUSEL.
-     */
-    private interface LayoutMode {
-        /**
-         * Tall and wide screen with details and updates shown side-by-side.
-         */
-        static final int TWO_COLUMN = 0;
-        /**
-         * Tall and narrow screen to allow swipe between the details and updates.
-         */
-        static final int VIEW_PAGER_AND_TAB_CAROUSEL = 1;
-        /**
-         * Short and wide screen to allow part of the other page to show.
-         */
-        static final int FRAGMENT_CAROUSEL = 2;
-        /**
-         * Same as FRAGMENT_CAROUSEL (allowing part of the other page to show) except the details
-         * layout is similar to the details layout in TWO_COLUMN mode.
-         */
-        static final int TWO_COLUMN_FRAGMENT_CAROUSEL = 3;
-    }
-
     private final Activity mActivity;
-    private final LayoutInflater mLayoutInflater;
     private final FragmentManager mFragmentManager;
-
-    private final View mViewContainer;
-    private final TransitionAnimationView mTransitionAnimationView;
-    private ContactDetailFragment mDetailFragment;
-    private ContactDetailUpdatesFragment mUpdatesFragment;
-
-    private View mDetailFragmentView;
-    private View mUpdatesFragmentView;
-
-    private final ViewPager mViewPager;
-    private ContactDetailViewPagerAdapter mViewPagerAdapter;
-    private int mViewPagerState;
-
-    private final ContactDetailTabCarousel mTabCarousel;
-    private final ContactDetailFragmentCarousel mFragmentCarousel;
-
     private final ContactDetailFragment.Listener mContactDetailFragmentListener;
+    private final TransitionAnimationView mTransitionAnimationView;
+    private final View mViewContainer;
 
+    private ContactDetailFragment mDetailFragment;
     private Contact mContactData;
     private Uri mContactUri;
 
-    private boolean mTabCarouselIsAnimating;
-
-    private boolean mContactHasUpdates;
-
-    private int mLayoutMode;
-
     public ContactDetailLayoutController(Activity activity, Bundle savedState,
             FragmentManager fragmentManager, TransitionAnimationView animationView,
             View viewContainer, ContactDetailFragment.Listener contactDetailFragmentListener) {
@@ -121,165 +64,36 @@
         }
 
         mActivity = activity;
-        mLayoutInflater = (LayoutInflater) activity.getSystemService(
-                Context.LAYOUT_INFLATER_SERVICE);
         mFragmentManager = fragmentManager;
         mContactDetailFragmentListener = contactDetailFragmentListener;
-
         mTransitionAnimationView = animationView;
-
-        // Retrieve views in case this is view pager and carousel mode
         mViewContainer = viewContainer;
 
-        mViewPager = (ViewPager) viewContainer.findViewById(R.id.pager);
-        mTabCarousel = (ContactDetailTabCarousel) viewContainer.findViewById(R.id.tab_carousel);
-
-        // Retrieve view in case this is in fragment carousel mode
-        mFragmentCarousel = (ContactDetailFragmentCarousel) viewContainer.findViewById(
-                R.id.fragment_carousel);
-
-        // Retrieve container views in case they are already in the XML layout
-        mDetailFragmentView = viewContainer.findViewById(R.id.about_fragment_container);
-        mUpdatesFragmentView = viewContainer.findViewById(R.id.updates_fragment_container);
-
-        // Determine the layout mode based on the presence of certain views in the layout XML.
-        if (mViewPager != null) {
-            mLayoutMode = LayoutMode.VIEW_PAGER_AND_TAB_CAROUSEL;
-        } else if (mFragmentCarousel != null) {
-            if (PhoneCapabilityTester.isUsingTwoPanes(mActivity)) {
-                mLayoutMode = LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL;
-            } else {
-                mLayoutMode = LayoutMode.FRAGMENT_CAROUSEL;
-            }
-        } else {
-            mLayoutMode = LayoutMode.TWO_COLUMN;
-        }
-
         initialize(savedState);
     }
 
     private void initialize(Bundle savedState) {
-        boolean fragmentsAddedToFragmentManager = true;
-        mDetailFragment = (ContactDetailFragment) mFragmentManager.findFragmentByTag(
-                ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
-        mUpdatesFragment = (ContactDetailUpdatesFragment) mFragmentManager.findFragmentByTag(
-                ContactDetailViewPagerAdapter.UPDATES_FRAGMENT_TAG);
-
-        // If the detail fragment was found in the {@link FragmentManager} then we don't need to add
-        // it again. Otherwise, create the fragments dynamically and remember to add them to the
-        // {@link FragmentManager}.
-        if (mDetailFragment == null) {
-            mDetailFragment = new ContactDetailFragment();
-            mUpdatesFragment = new ContactDetailUpdatesFragment();
-            fragmentsAddedToFragmentManager = false;
-        }
+        mDetailFragment = (ContactDetailFragment) mFragmentManager
+                .findFragmentById(id.contact_detail_about_fragment);
 
         mDetailFragment.setListener(mContactDetailFragmentListener);
         NfcHandler.register(mActivity, mDetailFragment);
 
-        // Read from savedState if possible
-        int currentPageIndex = 0;
         if (savedState != null) {
             mContactUri = savedState.getParcelable(KEY_CONTACT_URI);
-            mContactHasUpdates = savedState.getBoolean(KEY_CONTACT_HAS_UPDATES);
-            currentPageIndex = savedState.getInt(KEY_CURRENT_PAGE_INDEX, 0);
-        }
 
-        switch (mLayoutMode) {
-            case LayoutMode.VIEW_PAGER_AND_TAB_CAROUSEL: {
-                // Inflate 2 view containers to pass in as children to the {@link ViewPager},
-                // which will in turn be the parents to the mDetailFragment and mUpdatesFragment
-                // since the fragments must have the same parent view IDs in both landscape and
-                // portrait layouts.
-                mDetailFragmentView = mLayoutInflater.inflate(
-                        R.layout.contact_detail_about_fragment_container, mViewPager, false);
-                mUpdatesFragmentView = mLayoutInflater.inflate(
-                        R.layout.contact_detail_updates_fragment_container, mViewPager, false);
-
-                mViewPagerAdapter = new ContactDetailViewPagerAdapter();
-                mViewPagerAdapter.setAboutFragmentView(mDetailFragmentView);
-                mViewPagerAdapter.setUpdatesFragmentView(mUpdatesFragmentView);
-
-                mViewPager.addView(mDetailFragmentView);
-                mViewPager.addView(mUpdatesFragmentView);
-                mViewPager.setAdapter(mViewPagerAdapter);
-                mViewPager.setOnPageChangeListener(mOnPageChangeListener);
-
-                if (!fragmentsAddedToFragmentManager) {
-                    FragmentTransaction transaction = mFragmentManager.beginTransaction();
-                    transaction.add(R.id.about_fragment_container, mDetailFragment,
-                            ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
-                    transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
-                            ContactDetailViewPagerAdapter.UPDATES_FRAGMENT_TAG);
-                    transaction.commitAllowingStateLoss();
-                    mFragmentManager.executePendingTransactions();
-                }
-
-                mTabCarousel.setListener(mTabCarouselListener);
-                mTabCarousel.restoreCurrentTab(currentPageIndex);
-                mDetailFragment.setVerticalScrollListener(
-                        new VerticalScrollListener(TAB_INDEX_DETAIL));
-                mUpdatesFragment.setVerticalScrollListener(
-                        new VerticalScrollListener(TAB_INDEX_UPDATES));
-                mViewPager.setCurrentItem(currentPageIndex);
-                break;
-            }
-            case LayoutMode.TWO_COLUMN: {
-                if (!fragmentsAddedToFragmentManager) {
-                    FragmentTransaction transaction = mFragmentManager.beginTransaction();
-                    transaction.add(R.id.about_fragment_container, mDetailFragment,
-                            ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
-                    transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
-                            ContactDetailViewPagerAdapter.UPDATES_FRAGMENT_TAG);
-                    transaction.commitAllowingStateLoss();
-                    mFragmentManager.executePendingTransactions();
-                }
-                break;
-            }
-            case LayoutMode.FRAGMENT_CAROUSEL:
-            case LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL: {
-                // Add the fragments to the fragment containers in the carousel using a
-                // {@link FragmentTransaction} if they haven't already been added to the
-                // {@link FragmentManager}.
-                if (!fragmentsAddedToFragmentManager) {
-                    FragmentTransaction transaction = mFragmentManager.beginTransaction();
-                    transaction.add(R.id.about_fragment_container, mDetailFragment,
-                            ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
-                    transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
-                            ContactDetailViewPagerAdapter.UPDATES_FRAGMENT_TAG);
-                    transaction.commitAllowingStateLoss();
-                    mFragmentManager.executePendingTransactions();
-                }
-
-                mFragmentCarousel.setFragmentViews(
-                        (FrameLayoutWithOverlay) mDetailFragmentView,
-                        (FrameLayoutWithOverlay) mUpdatesFragmentView);
-                mFragmentCarousel.setCurrentPage(currentPageIndex);
-
-                break;
-            }
-        }
-
-        // Setup the layout if we already have a saved state
-        if (savedState != null) {
-            if (mContactHasUpdates) {
-                showContactWithUpdates(false);
-            } else {
-                showContactWithoutUpdates();
-            }
+            // Immediately setup layout since we have saved state
+            showContact();
         }
     }
 
     public void setContactData(Contact data) {
         final boolean contactWasLoaded;
-        final boolean contactHadUpdates;
         final boolean isDifferentContact;
         if (mContactData == null) {
-            contactHadUpdates = false;
             contactWasLoaded = false;
             isDifferentContact = true;
         } else {
-            contactHadUpdates = mContactHasUpdates;
             contactWasLoaded = true;
             isDifferentContact =
                     !UriUtils.areEqual(mContactData.getLookupUri(), data.getLookupUri());
@@ -301,50 +115,15 @@
             }
         }
 
-        showContactWithoutUpdates();
+        showContact();
     }
 
     public void showEmptyState() {
-        switch (mLayoutMode) {
-            case LayoutMode.FRAGMENT_CAROUSEL: {
-                mFragmentCarousel.setCurrentPage(0);
-                mFragmentCarousel.enableSwipe(false);
-                mDetailFragment.showEmptyState();
-                break;
-            }
-            case LayoutMode.TWO_COLUMN: {
-                mDetailFragment.setShowStaticPhoto(false);
-                mUpdatesFragmentView.setVisibility(View.GONE);
-                mDetailFragment.showEmptyState();
-                break;
-            }
-            case LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL: {
-                mFragmentCarousel.setCurrentPage(0);
-                mFragmentCarousel.enableSwipe(false);
-                mDetailFragment.setShowStaticPhoto(false);
-                mUpdatesFragmentView.setVisibility(View.GONE);
-                mDetailFragment.showEmptyState();
-                break;
-            }
-            case LayoutMode.VIEW_PAGER_AND_TAB_CAROUSEL: {
-                mDetailFragment.setShowStaticPhoto(false);
-                mDetailFragment.showEmptyState();
-                mTabCarousel.loadData(null);
-                mTabCarousel.setVisibility(View.GONE);
-                mViewPagerAdapter.enableSwipe(false);
-                mViewPager.setCurrentItem(0);
-                break;
-            }
-            default:
-                throw new IllegalStateException("Invalid LayoutMode " + mLayoutMode);
-        }
+        mDetailFragment.setShowStaticPhoto(false);
+        mDetailFragment.showEmptyState();
     }
 
-    /**
-     * Setup the layout for the contact with updates.
-     * TODO: Clean up this method so it's easier to understand.
-     */
-    private void showContactWithUpdates(boolean animateStateChange) {
+    private void showContact() {
         if (mContactData == null) {
             return;
         }
@@ -353,390 +132,20 @@
         mContactUri = mContactData.getLookupUri();
         boolean isDifferentContact = !UriUtils.areEqual(previousContactUri, mContactUri);
 
-        switch (mLayoutMode) {
-            case LayoutMode.TWO_COLUMN: {
-                if (!isDifferentContact && animateStateChange) {
-                    // This is screen is very hard to animate properly, because there is such a hard
-                    // cut from the regular version. A proper animation would have to reflow text
-                    // and move things around. Doing a simple cross-fade instead.
-                    mTransitionAnimationView.startMaskTransition(false, -1);
-                }
-
-                // Set the contact data (hide the static photo because the photo will already be in
-                // the header that scrolls with contact details).
-                mDetailFragment.setShowStaticPhoto(false);
-                // Show the updates fragment
-                mUpdatesFragmentView.setVisibility(View.VISIBLE);
-                break;
-            }
-            case LayoutMode.VIEW_PAGER_AND_TAB_CAROUSEL: {
-                // Update and show the tab carousel (also restore its last saved position)
-                mTabCarousel.loadData(mContactData);
-                mTabCarousel.restoreYCoordinate();
-                mTabCarousel.setVisibility(View.VISIBLE);
-                // Update ViewPager to allow swipe between all the fragments (to see updates)
-                mViewPagerAdapter.enableSwipe(true);
-                // If this is a different contact than before, then reset some views.
-                if (isDifferentContact) {
-                    resetViewPager();
-                    resetTabCarousel();
-                }
-                if (!isDifferentContact && animateStateChange) {
-                    mTabCarousel.animateAppear(mViewContainer.getWidth(),
-                            mDetailFragment.getFirstListItemOffset());
-                }
-                break;
-            }
-            case LayoutMode.FRAGMENT_CAROUSEL: {
-                // Allow swiping between all fragments
-                mFragmentCarousel.enableSwipe(true);
-                if (!isDifferentContact && animateStateChange) {
-                    mFragmentCarousel.animateAppear();
-                }
-                break;
-            }
-            case LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL: {
-                // Allow swiping between all fragments
-                mFragmentCarousel.enableSwipe(true);
-                if (isDifferentContact) {
-                    mFragmentCarousel.reset();
-                }
-                if (!isDifferentContact && animateStateChange) {
-                    mFragmentCarousel.animateAppear();
-                }
-                mDetailFragment.setShowStaticPhoto(false);
-                break;
-            }
-            default:
-                throw new IllegalStateException("Invalid LayoutMode " + mLayoutMode);
-        }
+        mDetailFragment.setShowStaticPhoto(true);
 
         if (isDifferentContact) {
-            resetFragments();
+            mDetailFragment.resetAdapter();
         }
 
         mDetailFragment.setData(mContactUri, mContactData);
-        mUpdatesFragment.setData(mContactUri, mContactData);
-    }
-
-    /**
-     * Setup the layout for the contact without updates.
-     * TODO: Clean up this method so it's easier to understand.
-     */
-    private void showContactWithoutUpdates() {
-        if (mContactData == null) {
-            return;
-        }
-
-        Uri previousContactUri = mContactUri;
-        mContactUri = mContactData.getLookupUri();
-        boolean isDifferentContact = !UriUtils.areEqual(previousContactUri, mContactUri);
-
-        switch (mLayoutMode) {
-            case LayoutMode.TWO_COLUMN:
-                // Show the static photo which is next to the list of scrolling contact details
-                mDetailFragment.setShowStaticPhoto(true);
-                // Hide the updates fragment
-                mUpdatesFragmentView.setVisibility(View.GONE);
-                break;
-            case LayoutMode.VIEW_PAGER_AND_TAB_CAROUSEL:
-                // Hide the tab carousel
-                mTabCarousel.setVisibility(View.GONE);
-                // Update ViewPager to disable swipe so that it only shows the detail fragment
-                // and switch to the detail fragment
-                mViewPagerAdapter.enableSwipe(false);
-                mViewPager.setCurrentItem(0, false /* smooth transition */);
-                break;
-            case LayoutMode.FRAGMENT_CAROUSEL:
-                // Disable swipe so only the detail fragment shows
-                mFragmentCarousel.setCurrentPage(0);
-                mFragmentCarousel.enableSwipe(false);
-                break;
-            case LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL:
-                mFragmentCarousel.setCurrentPage(0);
-                mFragmentCarousel.enableSwipe(false);
-                mDetailFragment.setShowStaticPhoto(true);
-                break;
-            default:
-                throw new IllegalStateException("Invalid LayoutMode " + mLayoutMode);
-        }
-
-        if (isDifferentContact) {
-            resetFragments();
-        }
-
-        mDetailFragment.setData(mContactUri, mContactData);
-    }
-
-    private void resetTabCarousel() {
-        mTabCarousel.reset();
-    }
-
-    private void resetViewPager() {
-        mViewPager.setCurrentItem(0, false /* smooth transition */);
-    }
-
-    private void resetFragments() {
-        mDetailFragment.resetAdapter();
-        mUpdatesFragment.resetAdapter();
     }
 
     public FragmentKeyListener getCurrentPage() {
-        switch (getCurrentPageIndex()) {
-            case 0:
-                return mDetailFragment;
-            case 1:
-                return mUpdatesFragment;
-            default:
-                throw new IllegalStateException("Invalid current item for ViewPager");
-        }
-    }
-
-    private int getCurrentPageIndex() {
-        // If the contact has social updates, then retrieve the current page based on the
-        // {@link ViewPager} or fragment carousel.
-        if (mContactHasUpdates) {
-            if (mViewPager != null) {
-                return mViewPager.getCurrentItem();
-            } else if (mFragmentCarousel != null) {
-                return mFragmentCarousel.getCurrentPage();
-            }
-        }
-        // Otherwise return the default page (detail fragment).
-        return 0;
+        return mDetailFragment;
     }
 
     public void onSaveInstanceState(Bundle outState) {
         outState.putParcelable(KEY_CONTACT_URI, mContactUri);
-        outState.putBoolean(KEY_CONTACT_HAS_UPDATES, mContactHasUpdates);
-        outState.putInt(KEY_CURRENT_PAGE_INDEX, getCurrentPageIndex());
-    }
-
-    private final OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() {
-
-        private ObjectAnimator mTabCarouselAnimator;
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-            // The user is horizontally dragging the {@link ViewPager}, so send
-            // these scroll changes to the tab carousel. Ignore these events though if the carousel
-            // is actually controlling the {@link ViewPager} scrolls because it will already be
-            // in the correct position.
-            if (mViewPager.isFakeDragging()) return;
-
-            int x = (int) ((position + positionOffset) *
-                    mTabCarousel.getAllowedHorizontalScrollLength());
-            mTabCarousel.scrollTo(x, 0);
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            // Since the {@link ViewPager} has committed to a new page now (but may not have
-            // finished scrolling yet), update the tab selection in the carousel.
-            mTabCarousel.setCurrentTab(position);
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            if (mViewPagerState == ViewPager.SCROLL_STATE_IDLE) {
-
-                // If we are leaving the IDLE state, we are starting a swipe.
-                // First cancel any pending animations on the tab carousel.
-                cancelTabCarouselAnimator();
-
-                // Sync the two lists because the list on the other page will start to show as
-                // we swipe over more.
-                syncScrollStateBetweenLists(mViewPager.getCurrentItem());
-
-            } else if (state == ViewPager.SCROLL_STATE_IDLE) {
-
-                // Otherwise if the {@link ViewPager} is idle now, a page has been selected and
-                // scrolled into place. Perform an animation of the tab carousel is needed.
-                int currentPageIndex = mViewPager.getCurrentItem();
-                int tabCarouselOffset = (int) mTabCarousel.getY();
-                boolean shouldAnimateTabCarousel;
-
-                // Find the offset position of the first item in the list of the current page.
-                int listOffset = getOffsetOfFirstItemInList(currentPageIndex);
-
-                // If the list was able to successfully offset by the tab carousel amount, then
-                // log this as the new Y coordinate for that page, and no animation is needed.
-                if (listOffset == tabCarouselOffset) {
-                    mTabCarousel.storeYCoordinate(currentPageIndex, tabCarouselOffset);
-                    shouldAnimateTabCarousel = false;
-                } else if (listOffset == Integer.MIN_VALUE) {
-                    // If the offset of the first item in the list is unknown (i.e. the item
-                    // is no longer visible on screen) then just animate the tab carousel to the
-                    // previously logged position.
-                    shouldAnimateTabCarousel = true;
-                } else if (Math.abs(listOffset) < Math.abs(tabCarouselOffset)) {
-                    // If the list could not offset the full amount of the tab carousel offset (i.e.
-                    // the list can only be scrolled a tiny amount), then animate the carousel down
-                    // to compensate.
-                    mTabCarousel.storeYCoordinate(currentPageIndex, listOffset);
-                    shouldAnimateTabCarousel = true;
-                } else {
-                    // By default, animate back to the Y coordinate of the tab carousel the last
-                    // time the other page was selected.
-                    shouldAnimateTabCarousel = true;
-                }
-
-                if (shouldAnimateTabCarousel) {
-                    float desiredOffset = mTabCarousel.getStoredYCoordinateForTab(currentPageIndex);
-                    if (desiredOffset != tabCarouselOffset) {
-                        createTabCarouselAnimator(desiredOffset);
-                        mTabCarouselAnimator.start();
-                    }
-                }
-            }
-            mViewPagerState = state;
-        }
-
-        private void createTabCarouselAnimator(float desiredValue) {
-            mTabCarouselAnimator = ObjectAnimator.ofFloat(
-                    mTabCarousel, "y", desiredValue).setDuration(75);
-            mTabCarouselAnimator.setInterpolator(AnimationUtils.loadInterpolator(
-                    mActivity, android.R.anim.accelerate_decelerate_interpolator));
-            mTabCarouselAnimator.addListener(mTabCarouselAnimatorListener);
-        }
-
-        private void cancelTabCarouselAnimator() {
-            if (mTabCarouselAnimator != null) {
-                mTabCarouselAnimator.cancel();
-                mTabCarouselAnimator = null;
-                mTabCarouselIsAnimating = false;
-            }
-        }
-    };
-
-    private void syncScrollStateBetweenLists(int currentPageIndex) {
-        // Since the user interacted with the currently visible page, we need to sync the
-        // list on the other page (i.e. if the updates page is the current page, modify the
-        // list in the details page).
-        if (currentPageIndex == TAB_INDEX_UPDATES) {
-            mDetailFragment.requestToMoveToOffset((int) mTabCarousel.getY());
-        } else {
-            mUpdatesFragment.requestToMoveToOffset((int) mTabCarousel.getY());
-        }
-    }
-
-    private int getOffsetOfFirstItemInList(int currentPageIndex) {
-        if (currentPageIndex == TAB_INDEX_DETAIL) {
-            return mDetailFragment.getFirstListItemOffset();
-        } else {
-            return mUpdatesFragment.getFirstListItemOffset();
-        }
-    }
-
-    /**
-     * This listener keeps track of whether the tab carousel animation is currently going on or not,
-     * in order to prevent other simultaneous changes to the Y position of the tab carousel which
-     * can cause flicker.
-     */
-    private final AnimatorListener mTabCarouselAnimatorListener = new AnimatorListener() {
-
-        @Override
-        public void onAnimationCancel(Animator animation) {
-            mTabCarouselIsAnimating = false;
-        }
-
-        @Override
-        public void onAnimationEnd(Animator animation) {
-            mTabCarouselIsAnimating = false;
-        }
-
-        @Override
-        public void onAnimationRepeat(Animator animation) {
-            mTabCarouselIsAnimating = true;
-        }
-
-        @Override
-        public void onAnimationStart(Animator animation) {
-            mTabCarouselIsAnimating = true;
-        }
-    };
-
-    private final ContactDetailTabCarousel.Listener mTabCarouselListener
-            = new ContactDetailTabCarousel.Listener() {
-
-        @Override
-        public void onTouchDown() {
-            // The user just started scrolling the carousel, so begin
-            // "fake dragging" the {@link ViewPager} if it's not already
-            // doing so.
-            if (!mViewPager.isFakeDragging()) mViewPager.beginFakeDrag();
-        }
-
-        @Override
-        public void onTouchUp() {
-            // The user just stopped scrolling the carousel, so stop
-            // "fake dragging" the {@link ViewPager} if it was doing so
-            // before.
-            if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();
-        }
-
-        @Override
-        public void onScrollChanged(int l, int t, int oldl, int oldt) {
-            // The user is scrolling the carousel, so send the scroll
-            // deltas to the {@link ViewPager} so it can move in sync.
-            if (mViewPager.isFakeDragging()) {
-                mViewPager.fakeDragBy(oldl - l);
-            }
-        }
-
-        @Override
-        public void onTabSelected(int position) {
-            // The user selected a tab, so update the {@link ViewPager}
-            mViewPager.setCurrentItem(position);
-        }
-    };
-
-    private final class VerticalScrollListener implements OnScrollListener {
-
-        private final int mPageIndex;
-
-        public VerticalScrollListener(int pageIndex) {
-            mPageIndex = pageIndex;
-        }
-
-        @Override
-        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
-                int totalItemCount) {
-            int currentPageIndex = mViewPager.getCurrentItem();
-            // Don't move the carousel if: 1) the contact does not have social updates because then
-            // tab carousel must not be visible, 2) if the view pager is still being scrolled,
-            // 3) if the current page being viewed is not this one, or 4) if the tab carousel
-            // is already being animated vertically.
-            if (!mContactHasUpdates || mViewPagerState != ViewPager.SCROLL_STATE_IDLE ||
-                    mPageIndex != currentPageIndex || mTabCarouselIsAnimating) {
-                return;
-            }
-            // If the FIRST item is not visible on the screen, then the carousel must be pinned
-            // at the top of the screen.
-            if (firstVisibleItem != 0) {
-                mTabCarousel.moveToYCoordinate(mPageIndex,
-                        -mTabCarousel.getAllowedVerticalScrollLength());
-                return;
-            }
-            View topView = view.getChildAt(firstVisibleItem);
-            if (topView == null) {
-                return;
-            }
-            int amtToScroll = Math.max((int) view.getChildAt(firstVisibleItem).getY(),
-                    -mTabCarousel.getAllowedVerticalScrollLength());
-            mTabCarousel.moveToYCoordinate(mPageIndex, amtToScroll);
-        }
-
-        @Override
-        public void onScrollStateChanged(AbsListView view, int scrollState) {
-            // Once the list has become IDLE, check if we need to sync the scroll position of
-            // the other list now. This will make swiping faster by doing the re-layout now
-            // (instead of at the start of a swipe). However, there will still be another check
-            // when we start swiping if the scroll positions are correct (to catch the edge case
-            // where the user flings and immediately starts a swipe so we never get the idle state).
-            if (scrollState == SCROLL_STATE_IDLE) {
-                syncScrollStateBetweenLists(mPageIndex);
-            }
-        }
     }
 }
diff --git a/src/com/android/contacts/detail/ContactDetailTabCarousel.java b/src/com/android/contacts/detail/ContactDetailTabCarousel.java
deleted file mode 100644
index 25bcac6..0000000
--- a/src/com/android/contacts/detail/ContactDetailTabCarousel.java
+++ /dev/null
@@ -1,516 +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.content.Context;
-import android.content.res.Resources;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewPropertyAnimator;
-import android.widget.HorizontalScrollView;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.util.MoreMath;
-import com.android.contacts.util.SchedulingUtils;
-
-/**
- * This is a horizontally scrolling carousel with 2 tabs: one to see info about the contact and
- * one to see updates from the contact.
- */
-public class ContactDetailTabCarousel extends HorizontalScrollView implements OnTouchListener {
-
-    private static final String TAG = ContactDetailTabCarousel.class.getSimpleName();
-
-    private static final int TRANSITION_TIME = 200;
-    private static final int TRANSITION_MOVE_IN_TIME = 150;
-
-    private static final int TAB_INDEX_ABOUT = 0;
-    private static final int TAB_INDEX_UPDATES = 1;
-    private static final int TAB_COUNT = 2;
-
-    /** Tab width as defined as a fraction of the screen width */
-    private float mTabWidthScreenWidthFraction;
-
-    /** Tab height as defined as a fraction of the screen width */
-    private float mTabHeightScreenWidthFraction;
-
-    /** Height in pixels of the shadow under the tab carousel */
-    private int mTabShadowHeight;
-
-    private ImageView mPhotoView;
-    private View mPhotoViewOverlay;
-    private TextView mStatusView;
-    private ImageView mStatusPhotoView;
-    private final ContactDetailPhotoSetter mPhotoSetter = new ContactDetailPhotoSetter();
-
-    private Listener mListener;
-
-    private int mCurrentTab = TAB_INDEX_ABOUT;
-
-    private View mTabAndShadowContainer;
-    private View mShadow;
-    private CarouselTab mAboutTab;
-    private View mTabDivider;
-    private CarouselTab mUpdatesTab;
-
-    /** Last Y coordinate of the carousel when the tab at the given index was selected */
-    private final float[] mYCoordinateArray = new float[TAB_COUNT];
-
-    private int mTabDisplayLabelHeight;
-
-    private boolean mScrollToCurrentTab = false;
-    private int mLastScrollPosition = Integer.MIN_VALUE;
-    private int mAllowedHorizontalScrollLength = Integer.MIN_VALUE;
-    private int mAllowedVerticalScrollLength = Integer.MIN_VALUE;
-
-    /** Factor to scale scroll-amount sent to listeners. */
-    private float mScrollScaleFactor = 1.0f;
-
-    private static final float MAX_ALPHA = 0.5f;
-
-    /**
-     * Interface for callbacks invoked when the user interacts with the carousel.
-     */
-    public interface Listener {
-        public void onTouchDown();
-        public void onTouchUp();
-
-        public void onScrollChanged(int l, int t, int oldl, int oldt);
-        public void onTabSelected(int position);
-    }
-
-    public ContactDetailTabCarousel(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        setOnTouchListener(this);
-
-        Resources resources = mContext.getResources();
-        mTabDisplayLabelHeight = resources.getDimensionPixelSize(
-                R.dimen.detail_tab_carousel_tab_label_height);
-        mTabShadowHeight = resources.getDimensionPixelSize(
-                R.dimen.detail_contact_photo_shadow_height);
-        mTabWidthScreenWidthFraction = resources.getFraction(
-                R.fraction.tab_width_screen_width_percentage, 1, 1);
-        mTabHeightScreenWidthFraction = resources.getFraction(
-                R.fraction.tab_height_screen_width_percentage, 1, 1);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        mTabAndShadowContainer = findViewById(R.id.tab_and_shadow_container);
-        mAboutTab = (CarouselTab) findViewById(R.id.tab_about);
-        mAboutTab.setLabel(mContext.getString(R.string.contactDetailAbout));
-        mAboutTab.setOverlayOnClickListener(mAboutTabTouchInterceptListener);
-
-        mTabDivider = findViewById(R.id.tab_divider);
-
-        mUpdatesTab = (CarouselTab) findViewById(R.id.tab_update);
-        mUpdatesTab.setLabel(mContext.getString(R.string.contactDetailUpdates));
-        mUpdatesTab.setOverlayOnClickListener(mUpdatesTabTouchInterceptListener);
-
-        mShadow = findViewById(R.id.shadow);
-
-        // Retrieve the photo view for the "about" tab
-        // TODO: This should be moved down to mAboutTab, so that it hosts its own controls
-        mPhotoView = (ImageView) mAboutTab.findViewById(R.id.photo);
-        mPhotoViewOverlay = mAboutTab.findViewById(R.id.photo_overlay);
-
-        // Retrieve the social update views for the "updates" tab
-        // TODO: This should be moved down to mUpdatesTab, so that it hosts its own controls
-        mStatusView = (TextView) mUpdatesTab.findViewById(R.id.status);
-        mStatusPhotoView = (ImageView) mUpdatesTab.findViewById(R.id.status_photo);
-
-        // Workaround for framework issue... it shouldn't be necessary to have a
-        // clickable object in the hierarchy, but if not the horizontal scroll
-        // behavior doesn't work. Note: the "About" tab doesn't need this
-        // because we set a real click-handler elsewhere.
-        mStatusView.setClickable(true);
-        mStatusPhotoView.setClickable(true);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int screenWidth = MeasureSpec.getSize(widthMeasureSpec);
-        // Compute the width of a tab as a fraction of the screen width
-        int tabWidth = Math.round(mTabWidthScreenWidthFraction * screenWidth);
-
-        // Find the allowed scrolling length by subtracting the current visible screen width
-        // from the total length of the tabs.
-        mAllowedHorizontalScrollLength = tabWidth * TAB_COUNT - screenWidth;
-
-        // Scrolling by mAllowedHorizontalScrollLength causes listeners to
-        // scroll by the entire screen amount; compute the scale-factor
-        // necessary to make this so.
-        if (mAllowedHorizontalScrollLength == 0) {
-            // Guard against divide-by-zero.
-            // Note: this hard-coded value prevents a crash, but won't result in the
-            // desired scrolling behavior.  We rely on the framework calling onMeasure()
-            // again with a non-zero screen width.
-            mScrollScaleFactor = 1.0f;
-            Log.w(TAG, "set scale-factor to 1.0 to avoid divide-by-zero");
-        } else {
-            mScrollScaleFactor = screenWidth / mAllowedHorizontalScrollLength;
-        }
-
-        int tabHeight = Math.round(screenWidth * mTabHeightScreenWidthFraction) + mTabShadowHeight;
-        // Set the child {@link LinearLayout} to be TAB_COUNT * the computed tab width so that the
-        // {@link LinearLayout}'s children (which are the tabs) will evenly split that width.
-        if (getChildCount() > 0) {
-            View child = getChildAt(0);
-
-            // add 1 dip of separation between the tabs
-            final int seperatorPixels =
-                    (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
-                    getResources().getDisplayMetrics()) + 0.5f);
-
-            child.measure(
-                    MeasureSpec.makeMeasureSpec(
-                            TAB_COUNT * tabWidth +
-                            (TAB_COUNT - 1) * seperatorPixels, MeasureSpec.EXACTLY),
-                    MeasureSpec.makeMeasureSpec(tabHeight, MeasureSpec.EXACTLY));
-        }
-
-        mAllowedVerticalScrollLength = tabHeight - mTabDisplayLabelHeight - mTabShadowHeight;
-        setMeasuredDimension(
-                resolveSize(screenWidth, widthMeasureSpec),
-                resolveSize(tabHeight, heightMeasureSpec));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-
-        // Defer this stuff until after the layout has finished.  This is because
-        // updateAlphaLayers() ultimately results in another layout request, and
-        // the framework currently can't handle this safely.
-        if (!mScrollToCurrentTab) return;
-        mScrollToCurrentTab = false;
-        SchedulingUtils.doAfterLayout(this, new Runnable() {
-            @Override
-            public void run() {
-                scrollTo(mCurrentTab == TAB_INDEX_ABOUT ? 0 : mAllowedHorizontalScrollLength, 0);
-                updateAlphaLayers();
-            }
-        });
-    }
-
-    /** When clicked, selects the corresponding tab. */
-    private class TabClickListener implements OnClickListener {
-        private final int mTab;
-
-        public TabClickListener(int tab) {
-            super();
-            mTab = tab;
-        }
-
-        @Override
-        public void onClick(View v) {
-            mListener.onTabSelected(mTab);
-        }
-    }
-
-    private final TabClickListener mAboutTabTouchInterceptListener =
-            new TabClickListener(TAB_INDEX_ABOUT);
-
-    private final TabClickListener mUpdatesTabTouchInterceptListener =
-            new TabClickListener(TAB_INDEX_UPDATES);
-
-    /**
-     * Does in "appear" animation to allow a seamless transition from
-     * the "No updates" mode.
-     * @param width Width of the container. As we haven't been layed out yet, we can't know
-     * @param scrollOffset The offset by how far we scrolled, where 0=not scrolled, -x=scrolled by
-     * x pixels, Integer.MIN_VALUE=scrolled so far that the image is not visible in "no updates"
-     * mode of this screen
-     */
-    public void animateAppear(int width, int scrollOffset) {
-        final float photoHeight = mTabHeightScreenWidthFraction * width;
-        final boolean animateZoomAndFade;
-        int pixelsToScrollVertically = 0;
-
-        // Depending on how far we are scrolled down, there is one of three animations:
-        //   - Zoom and fade the picture (if it is still visible)
-        //   - Scroll, zoom and fade (if the picture is mostly invisible and we now have a
-        //     bigger visible region due to the pinning)
-        //   - Just scroll if the picture is completely invisible. This time, no zoom is needed
-        if (scrollOffset == Integer.MIN_VALUE) {
-            // animate in completely by scrolling. no need for zooming here
-            pixelsToScrollVertically = mTabDisplayLabelHeight;
-            animateZoomAndFade = false;
-        } else {
-            final int pixelsOfPhotoLeft = Math.round(photoHeight) + scrollOffset;
-            if (pixelsOfPhotoLeft > mTabDisplayLabelHeight) {
-                // nothing to scroll
-                pixelsToScrollVertically = 0;
-            } else {
-                pixelsToScrollVertically = mTabDisplayLabelHeight - pixelsOfPhotoLeft;
-            }
-            animateZoomAndFade = true;
-        }
-
-        if (pixelsToScrollVertically != 0) {
-            // We can't animate ourselves here, because our own translation is needed for the user's
-            // scrolling. Instead, we use our only child. As we are transparent, that is just as
-            // good
-            mTabAndShadowContainer.setTranslationY(-pixelsToScrollVertically);
-            final ViewPropertyAnimator animator = mTabAndShadowContainer.animate();
-            animator.translationY(0.0f);
-            animator.setDuration(TRANSITION_MOVE_IN_TIME);
-        }
-
-        if (animateZoomAndFade) {
-            // Hack: We have two types of possible layouts:
-            //   If the picture is square, it is square in both "with updates" and "without updates"
-            //     --> no need for scale animation here
-            //     example: 10inch tablet portrait
-            //   If the picture is non-square, it is full-width in "without updates" and something
-            //     arbitrary in "with updates"
-            //     --> do animation with container
-            //     example: 4.6inch phone portrait
-            final boolean squarePicture =
-                    mTabWidthScreenWidthFraction == mTabHeightScreenWidthFraction;
-            final int firstTransitionTime;
-            if (squarePicture) {
-                firstTransitionTime = 0;
-            } else {
-                // For x, we need to scale our container so we'll animate the whole tab
-                // (unfortunately, we need to have the text invisible during this transition as it
-                // would also be stretched)
-                float revScale = 1.0f/mTabWidthScreenWidthFraction;
-                mAboutTab.setScaleX(revScale);
-                mAboutTab.setPivotX(0.0f);
-                final ViewPropertyAnimator aboutAnimator = mAboutTab.animate();
-                aboutAnimator.setDuration(TRANSITION_TIME);
-                aboutAnimator.scaleX(1.0f);
-
-                // For y, we need to scale only the picture itself because we want it to be cropped
-                mPhotoView.setScaleY(revScale);
-                mPhotoView.setPivotY(photoHeight * 0.5f);
-                final ViewPropertyAnimator photoAnimator = mPhotoView.animate();
-                photoAnimator.setDuration(TRANSITION_TIME);
-                photoAnimator.scaleY(1.0f);
-                firstTransitionTime = TRANSITION_TIME;
-            }
-
-            // Animate in the labels after the above transition is finished
-            mAboutTab.fadeInLabelViewAnimator(firstTransitionTime, true);
-            mUpdatesTab.fadeInLabelViewAnimator(firstTransitionTime, false);
-
-            final float pixelsToTranslate = (1.0f - mTabWidthScreenWidthFraction) * width;
-            // Views to translate
-            for (View view : new View[] { mUpdatesTab, mTabDivider }) {
-                view.setTranslationX(pixelsToTranslate);
-                final ViewPropertyAnimator translateAnimator = view.animate();
-                translateAnimator.translationX(0.0f);
-                translateAnimator.setDuration(TRANSITION_TIME);
-            }
-
-            // Another hack: If the picture is square, there is no shadow in "Without updates"
-            //    --> fade it in after the translations are done
-            if (squarePicture) {
-                mShadow.setAlpha(0.0f);
-                mShadow.animate().setStartDelay(TRANSITION_TIME).alpha(1.0f);
-            }
-        }
-    }
-
-    private void updateAlphaLayers() {
-        float alpha = mLastScrollPosition * MAX_ALPHA / mAllowedHorizontalScrollLength;
-        alpha = MoreMath.clamp(alpha, 0.0f, 1.0f);
-        mAboutTab.setAlphaLayerValue(alpha);
-        mUpdatesTab.setAlphaLayerValue(MAX_ALPHA - alpha);
-    }
-
-    @Override
-    protected void onScrollChanged(int x, int y, int oldX, int oldY) {
-        super.onScrollChanged(x, y, oldX, oldY);
-
-        // Guard against framework issue where onScrollChanged() is called twice
-        // for each touch-move event.  This wreaked havoc on the tab-carousel: the
-        // view-pager moved twice as fast as it should because we called fakeDragBy()
-        // twice with the same value.
-        if (mLastScrollPosition == x) return;
-
-        // Since we never completely scroll the about/updates tabs off-screen,
-        // the draggable range is less than the width of the carousel. Our
-        // listeners don't care about this... if we scroll 75% percent of our
-        // draggable range, they want to scroll 75% of the entire carousel
-        // width, not the same number of pixels that we scrolled.
-        int scaledL = (int) (x * mScrollScaleFactor);
-        int oldScaledL = (int) (oldX * mScrollScaleFactor);
-        mListener.onScrollChanged(scaledL, y, oldScaledL, oldY);
-
-        mLastScrollPosition = x;
-        updateAlphaLayers();
-    }
-
-    /**
-     * Reset the carousel to the start position (i.e. because new data will be loaded in for a
-     * different contact).
-     */
-    public void reset() {
-        scrollTo(0, 0);
-        setCurrentTab(0);
-        moveToYCoordinate(0, 0);
-    }
-
-    /**
-     * Set the current tab that should be restored when the view is first laid out.
-     */
-    public void restoreCurrentTab(int position) {
-        setCurrentTab(position);
-        // It is only possible to scroll the view after onMeasure() has been called (where the
-        // allowed horizontal scroll length is determined). Hence, set a flag that will be read
-        // in onLayout() after the children and this view have finished being laid out.
-        mScrollToCurrentTab = true;
-    }
-
-    /**
-     * Restore the Y position of this view to the last manually requested value. This can be done
-     * after the parent has been re-laid out again, where this view's position could have been
-     * lost if the view laid outside its parent's bounds.
-     */
-    public void restoreYCoordinate() {
-        setY(getStoredYCoordinateForTab(mCurrentTab));
-    }
-
-    /**
-     * Request that the view move to the given Y coordinate. Also store the Y coordinate as the
-     * last requested Y coordinate for the given tabIndex.
-     */
-    public void moveToYCoordinate(int tabIndex, float y) {
-        setY(y);
-        storeYCoordinate(tabIndex, y);
-    }
-
-    /**
-     * Store this information as the last requested Y coordinate for the given tabIndex.
-     */
-    public void storeYCoordinate(int tabIndex, float y) {
-        mYCoordinateArray[tabIndex] = y;
-    }
-
-    /**
-     * Returns the stored Y coordinate of this view the last time the user was on the selected
-     * tab given by tabIndex.
-     */
-    public float getStoredYCoordinateForTab(int tabIndex) {
-        return mYCoordinateArray[tabIndex];
-    }
-
-    /**
-     * Returns the number of pixels that this view can be scrolled horizontally.
-     */
-    public int getAllowedHorizontalScrollLength() {
-        return mAllowedHorizontalScrollLength;
-    }
-
-    /**
-     * Returns the number of pixels that this view can be scrolled vertically while still allowing
-     * the tab labels to still show.
-     */
-    public int getAllowedVerticalScrollLength() {
-        return mAllowedVerticalScrollLength;
-    }
-
-    /**
-     * Updates the tab selection.
-     */
-    public void setCurrentTab(int position) {
-        final CarouselTab selected, deselected;
-
-        switch (position) {
-            case TAB_INDEX_ABOUT:
-                selected = mAboutTab;
-                deselected = mUpdatesTab;
-                break;
-            case TAB_INDEX_UPDATES:
-                selected = mUpdatesTab;
-                deselected = mAboutTab;
-                break;
-            default:
-                throw new IllegalStateException("Invalid tab position " + position);
-        }
-        selected.showSelectedState();
-        selected.setOverlayClickable(false);
-        deselected.showDeselectedState();
-        deselected.setOverlayClickable(true);
-        mCurrentTab = position;
-    }
-
-    /**
-     * Loads the data from the Loader-Result. This is the only function that has to be called
-     * from the outside to fully setup the View
-     */
-    public void loadData(Contact contactData) {
-        if (contactData == null) return;
-
-        // TODO: Move this into the {@link CarouselTab} class when the updates
-        // fragment code is more finalized.
-        final boolean expandOnClick = contactData.getPhotoUri() != null;
-        final OnClickListener listener = mPhotoSetter.setupContactPhotoForClick(
-                mContext, contactData, mPhotoView, expandOnClick);
-
-        if (expandOnClick || contactData.isWritableContact(mContext)) {
-            mPhotoViewOverlay.setOnClickListener(listener);
-        } else {
-            // Work around framework issue... if we instead use
-            // setClickable(false), then we can't swipe horizontally.
-            mPhotoViewOverlay.setOnClickListener(null);
-        }
-
-        ContactDetailDisplayUtils.setSocialSnippet(
-                mContext, contactData, mStatusView, mStatusPhotoView);
-    }
-
-    /**
-     * Set the given {@link Listener} to handle carousel events.
-     */
-    public void setListener(Listener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        switch (event.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                mListener.onTouchDown();
-                return true;
-            case MotionEvent.ACTION_UP:
-                mListener.onTouchUp();
-                return true;
-        }
-        return super.onTouchEvent(event);
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        boolean interceptTouch = super.onInterceptTouchEvent(ev);
-        if (interceptTouch) {
-            mListener.onTouchDown();
-        }
-        return interceptTouch;
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
deleted file mode 100644
index 71186fe..0000000
--- a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
+++ /dev/null
@@ -1,159 +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.ListFragment;
-import android.content.ContentUris;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.ContactsContract.StreamItems;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView.OnScrollListener;
-import android.widget.ListView;
-
-import com.android.contacts.R;
-import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
-import com.android.contacts.detail.ContactDetailDisplayUtils.StreamPhotoTag;
-import com.android.contacts.util.StreamItemEntry;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.Contact;
-import com.android.contacts.common.model.account.AccountType;
-
-public class ContactDetailUpdatesFragment extends ListFragment implements FragmentKeyListener {
-
-    private static final String TAG = "ContactDetailUpdatesFragment";
-
-    private Contact mContactData;
-    private Uri mLookupUri;
-
-    private LayoutInflater mInflater;
-    private StreamItemAdapter mStreamItemAdapter;
-
-    private OnScrollListener mVerticalScrollListener;
-
-    /**
-     * Listener on clicks on a stream item.
-     * <p>
-     * It assumes the view has a tag of type {@link StreamItemEntry} associated with it.
-     */
-    private final View.OnClickListener mStreamItemClickListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View view) {
-            StreamItemEntry streamItemEntry = (StreamItemEntry) view.getTag();
-            if (streamItemEntry == null) {
-                // Ignore if this item does not have a stream item associated with it.
-                return;
-            }
-            final AccountType accountType = getAccountTypeForStreamItemEntry(streamItemEntry);
-
-            final Uri uri = ContentUris.withAppendedId(StreamItems.CONTENT_URI,
-                    streamItemEntry.getId());
-            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
-            intent.setClassName(accountType.syncAdapterPackageName,
-                    accountType.getViewStreamItemActivity());
-            startActivity(intent);
-        }
-    };
-
-    private final View.OnClickListener mStreamItemPhotoItemClickListener
-            = new View.OnClickListener() {
-        @Override
-        public void onClick(View view) {
-            StreamPhotoTag tag = (StreamPhotoTag) view.getTag();
-            if (tag == null) {
-                return;
-            }
-            final AccountType accountType = getAccountTypeForStreamItemEntry(tag.streamItem);
-
-            final Intent intent = new Intent(Intent.ACTION_VIEW, tag.getStreamItemPhotoUri());
-            intent.setClassName(accountType.syncAdapterPackageName,
-                    accountType.getViewStreamItemPhotoActivity());
-            startActivity(intent);
-        }
-    };
-
-    private AccountType getAccountTypeForStreamItemEntry(StreamItemEntry streamItemEntry) {
-        return AccountTypeManager.getInstance(getActivity()).getAccountType(
-                streamItemEntry.getAccountType(), streamItemEntry.getDataSet());
-    }
-
-    public ContactDetailUpdatesFragment() {
-        // Explicit constructor for inflation
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
-        mInflater = inflater;
-        return mInflater.inflate(R.layout.contact_detail_updates_fragment, container, false);
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        mStreamItemAdapter = new StreamItemAdapter(getActivity(), mStreamItemClickListener,
-                mStreamItemPhotoItemClickListener);
-        setListAdapter(mStreamItemAdapter);
-        getListView().setOnScrollListener(mVerticalScrollListener);
-    }
-
-    public void setData(Uri lookupUri, Contact result) {
-        if (result == null) {
-            return;
-        }
-        mLookupUri = lookupUri;
-        mContactData = result;
-    }
-
-    /**
-     * Reset the list adapter in this {@link Fragment} to get rid of any saved scroll position
-     * from a previous contact.
-     */
-    public void resetAdapter() {
-        setListAdapter(mStreamItemAdapter);
-    }
-
-    @Override
-    public boolean handleKeyDown(int keyCode) {
-        return false;
-    }
-
-    public void setVerticalScrollListener(OnScrollListener listener) {
-        mVerticalScrollListener = listener;
-    }
-
-    /**
-     * 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 ContactDetailDisplayUtils.getFirstListItemOffset(getListView());
-    }
-
-    /**
-     * 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) {
-        ContactDetailDisplayUtils.requestToMoveToOffset(getListView(), offset);
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java b/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java
deleted file mode 100644
index 4213490..0000000
--- a/src/com/android/contacts/detail/ContactDetailViewPagerAdapter.java
+++ /dev/null
@@ -1,130 +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.os.Parcelable;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Adapter for the {@link ViewPager} for the contact detail page for a contact in 2 cases:
- * 1) without social updates, and 2) with social updates. The default initial case is for
- * the contact with social updates which uses all possible pages.
- */
-public class ContactDetailViewPagerAdapter extends PagerAdapter {
-
-    public static final String ABOUT_FRAGMENT_TAG = "view-pager-about-fragment";
-    public static final String UPDATES_FRAGMENT_TAG = "view-pager-updates-fragment";
-
-    private static final int INDEX_ABOUT_FRAGMENT = 0;
-    private static final int INDEX_UPDATES_FRAGMENT = 1;
-
-    private static final int MAX_FRAGMENT_VIEW_COUNT = 2;
-
-    /**
-     * The initial value for the view count needs to be MAX_FRAGMENT_VIEW_COUNT,
-     * otherwise anything smaller would break screen rotation functionality for a user viewing
-     * a contact with social updates (i.e. the user was viewing the second page, rotates the
-     * device, the view pager requires the second page to exist immediately on launch).
-     */
-    private int mFragmentViewCount = MAX_FRAGMENT_VIEW_COUNT;
-
-    private View mAboutFragmentView;
-    private View mUpdatesFragmentView;
-
-    public ContactDetailViewPagerAdapter() {
-    }
-
-    public void setAboutFragmentView(View view) {
-        mAboutFragmentView = view;
-    }
-
-    public void setUpdatesFragmentView(View view) {
-        mUpdatesFragmentView = view;
-    }
-
-    /**
-     * Enable swiping if the detail and update fragments should be showing. Otherwise diable
-     * swiping if only the detail fragment should be showing.
-     */
-    public void enableSwipe(boolean enable) {
-        mFragmentViewCount = enable ? MAX_FRAGMENT_VIEW_COUNT : 1;
-        notifyDataSetChanged();
-    }
-
-    @Override
-    public int getCount() {
-        return mFragmentViewCount;
-    }
-
-    /** Gets called when the number of items changes. */
-    @Override
-    public int getItemPosition(Object object) {
-        // Always return a valid index for the about fragment view because it's always shown
-        // whether the contact has social updates or not.
-        if (object == mAboutFragmentView) {
-            return INDEX_ABOUT_FRAGMENT;
-        }
-        // Only return a valid index for the updates fragment view if our view count > 1.
-        if (object == mUpdatesFragmentView && mFragmentViewCount > 1) {
-            return INDEX_UPDATES_FRAGMENT;
-        }
-        // Otherwise the view should have no position.
-        return POSITION_NONE;
-    }
-
-    @Override
-    public void startUpdate(ViewGroup container) {
-    }
-
-    @Override
-    public Object instantiateItem(ViewGroup container, int position) {
-        switch (position) {
-            case INDEX_ABOUT_FRAGMENT:
-                mAboutFragmentView.setVisibility(View.VISIBLE);
-                return mAboutFragmentView;
-            case INDEX_UPDATES_FRAGMENT:
-                mUpdatesFragmentView.setVisibility(View.VISIBLE);
-                return mUpdatesFragmentView;
-        }
-        throw new IllegalArgumentException("Invalid position: " + position);
-    }
-
-    @Override
-    public void destroyItem(ViewGroup container, int position, Object object) {
-        ((View) object).setVisibility(View.GONE);
-    }
-
-    @Override
-    public void finishUpdate(ViewGroup container) {
-    }
-
-    @Override
-    public boolean isViewFromObject(View view, Object object) {
-        return ((View) object) == view;
-    }
-
-    @Override
-    public Parcelable saveState() {
-        return null;
-    }
-
-    @Override
-    public void restoreState(Parcelable state, ClassLoader loader) {
-    }
-}
diff --git a/src/com/android/contacts/detail/StreamItemAdapter.java b/src/com/android/contacts/detail/StreamItemAdapter.java
deleted file mode 100644
index 6e1adc5..0000000
--- a/src/com/android/contacts/detail/StreamItemAdapter.java
+++ /dev/null
@@ -1,151 +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.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.util.StreamItemEntry;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/**
- * List adapter for stream items of a given contact.
- */
-public class StreamItemAdapter extends BaseAdapter {
-    /** The header view, hidden under the tab carousel, if present. */
-    private static final int ITEM_VIEW_TYPE_HEADER = 0;
-    /** The updates in the list. */
-    private static final int ITEM_VIEW_TYPE_STREAM_ITEM = 1;
-
-    private final Context mContext;
-    private final View.OnClickListener mItemClickListener;
-    private final View.OnClickListener mPhotoClickListener;
-    private final LayoutInflater mInflater;
-
-    private List<StreamItemEntry> mStreamItems;
-
-    public StreamItemAdapter(Context context, View.OnClickListener itemClickListener,
-            View.OnClickListener photoClickListener) {
-        mContext = context;
-        mItemClickListener = itemClickListener;
-        mPhotoClickListener = photoClickListener;
-        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        mStreamItems = Lists.newArrayList();
-    }
-
-    @Override
-    public int getCount() {
-        // The header should only be included as items in the list if there are other
-        // stream items.
-        int count = mStreamItems.size();
-        return (count == 0) ? 0 : (count + 1);
-    }
-
-    @Override
-    public Object getItem(int position) {
-        if (position == 0) {
-            return null;
-        }
-        return mStreamItems.get(position - 1);
-    }
-
-    @Override
-    public long getItemId(int position) {
-        if (position == 0) {
-            return -1;
-        }
-        return position - 1;
-    }
-
-    @Override
-    public boolean isEnabled(int position) {
-        // Make all list items disabled, so they're not clickable.
-        // We make child views clickable in getvView() if the account type supports
-        // viewStreamItemActivity or viewStreamItemPhotoActivity.
-        return false;
-    }
-
-    @Override
-    public boolean areAllItemsEnabled() {
-        // See isEnabled().
-        return false;
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-        if (position == 0) {
-            return mInflater.inflate(R.layout.updates_header_contact, null);
-        }
-        final StreamItemEntry streamItem = (StreamItemEntry) getItem(position);
-        final AccountTypeManager manager = AccountTypeManager.getInstance(mContext);
-        final AccountType accountType =
-                manager.getAccountType(streamItem.getAccountType(), streamItem.getDataSet());
-
-        final View view = ContactDetailDisplayUtils.createStreamItemView(
-                mInflater, mContext, convertView, streamItem,
-                // Only pass the photo click listener if the account type has the photo
-                // view activity.
-                (accountType.getViewStreamItemPhotoActivity() == null) ? null : mPhotoClickListener
-                );
-        final View contentView = view.findViewById(R.id.stream_item_content);
-
-        // If the account type has the stream item view activity, make the stream container
-        // clickable.
-        if (accountType.getViewStreamItemActivity() != null) {
-            contentView.setTag(streamItem);
-            contentView.setFocusable(true);
-            contentView.setOnClickListener(mItemClickListener);
-            contentView.setEnabled(true);
-        } else {
-            contentView.setTag(null);
-            contentView.setFocusable(false);
-            contentView.setOnClickListener(null);
-            // setOnClickListener makes it clickable, so we need to overwrite it.
-            contentView.setClickable(false);
-            contentView.setEnabled(false);
-        }
-        return view;
-    }
-
-    @Override
-    public int getViewTypeCount() {
-        // ITEM_VIEW_TYPE_HEADER and ITEM_VIEW_TYPE_STREAM_ITEM
-        return 2;
-    }
-
-    @Override
-    public int getItemViewType(int position) {
-        if (position == 0) {
-            return ITEM_VIEW_TYPE_HEADER;
-        }
-        return ITEM_VIEW_TYPE_STREAM_ITEM;
-    }
-
-    public void setStreamItems(List<StreamItemEntry> streamItems) {
-        mStreamItems = streamItems;
-        notifyDataSetChanged();
-    }
-}
diff --git a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
deleted file mode 100644
index abd4680..0000000
--- a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
+++ /dev/null
@@ -1,148 +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.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.View;
-
-import com.android.contacts.util.StreamItemEntry;
-import com.android.contacts.util.StreamItemEntryBuilder;
-
-import com.google.common.collect.Lists;
-
-import java.util.ArrayList;
-
-// TODO: We should have tests for action, but that requires a mock sync-adapter that specifies
-// an action or doesn't
-
-// TODO Add test for photo click
-
-/**
- * Unit tests for {@link StreamItemAdapter}.
- */
-@SmallTest
-public class StreamItemAdapterTest extends AndroidTestCase {
-    private StreamItemAdapter mAdapter;
-    private FakeOnClickListener mListener;
-    private FakeOnClickListener mPhotoListener;
-    private View mView;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mListener = new FakeOnClickListener();
-        mAdapter = new StreamItemAdapter(getContext(), mListener, mPhotoListener);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        mAdapter = null;
-        mListener = null;
-        super.tearDown();
-    }
-
-    public void testGetCount_Empty() {
-        mAdapter.setStreamItems(createStreamItemList(0));
-        // The header and title are gone when there are no stream items.
-        assertEquals(0, mAdapter.getCount());
-    }
-
-    public void testGetCount_NonEmpty() {
-        mAdapter.setStreamItems(createStreamItemList(3));
-        // There is one extra view: the header.
-        assertEquals(4, mAdapter.getCount());
-    }
-
-    public void testGetView_Header() {
-        // Just check that we can inflate it correctly.
-        mView = mAdapter.getView(0, null, null);
-    }
-
-    /** Counter used by {@link #createStreamItemEntryBuilder()} to create unique builders. */
-    private int mCreateStreamItemEntryBuilderCounter = 0;
-
-    /** Returns a stream item builder with basic information in it. */
-    private StreamItemEntryBuilder createStreamItemEntryBuilder() {
-        return new StreamItemEntryBuilder().setText(
-                "text #" + mCreateStreamItemEntryBuilderCounter++);
-    }
-
-    /** Creates a list containing the given number of {@link StreamItemEntry}s. */
-    private ArrayList<StreamItemEntry> createStreamItemList(int count) {
-        ArrayList<StreamItemEntry> list = Lists.newArrayList();
-        for (int index = 0; index < count; ++index) {
-            list.add(createStreamItemEntryBuilder().build(getContext()));
-        }
-        return list;
-    }
-
-    /** Checks that the stream item view has a click listener. */
-    private void assertStreamItemViewHasOnClickListener() {
-        assertFalse("listener should have not been invoked yet", mListener.clicked);
-        mView.performClick();
-        assertTrue("listener should have been invoked", mListener.clicked);
-    }
-
-    /** Checks that the stream item view does not have a click listener. */
-    private void assertStreamItemViewHasNoOnClickListener() {
-        assertFalse("listener should have not been invoked yet", mListener.clicked);
-        mView.performClick();
-        assertFalse("listener should have not been invoked", mListener.clicked);
-    }
-
-    /** Checks that the stream item view is clickable. */
-    private void assertStreamItemViewFocusable() {
-        assertNotNull("should have a stream item", mView);
-        assertTrue("should be focusable", mView.isFocusable());
-    }
-
-    /** Asserts that there is a stream item but it is not clickable. */
-    private void assertStreamItemViewNotFocusable() {
-        assertNotNull("should have a stream item", mView);
-        assertFalse("should not be focusable", mView.isFocusable());
-    }
-
-    /** Checks that the stream item view has the given stream item as its tag. */
-    private void assertStreamItemViewHasTag(StreamItemEntry streamItem) {
-        Object tag = mView.getTag();
-        assertNotNull("should have a tag", tag);
-        assertTrue("should be a StreamItemEntry", tag instanceof StreamItemEntry);
-        StreamItemEntry streamItemTag = (StreamItemEntry) tag;
-        // The streamItem itself should be in the tag.
-        assertSame(streamItem, streamItemTag);
-    }
-
-    /** Checks that the stream item view has the given stream item as its tag. */
-    private void assertStreamItemViewHasNoTag() {
-        Object tag = mView.getTag();
-        assertNull("should not have a tag", tag);
-    }
-
-    /**
-     * Simple fake implementation of {@link View.OnClickListener} which sets a member variable to
-     * true when clicked.
-     */
-    private final class FakeOnClickListener implements View.OnClickListener {
-        public boolean clicked = false;
-
-        @Override
-        public void onClick(View view) {
-            clicked = true;
-        }
-    }
-}