Merge "Fix overlapping group editors"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e255fd2..9640536 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -361,28 +361,18 @@
             </intent-filter>
         </activity>
 
-
         <!-- List of groups -->
         <activity android:name=".activities.GroupBrowserActivity"
             android:label="@string/contactsGroupsLabel"
             android:theme="@style/PeopleTheme"
             android:uiOptions="splitActionBarWhenNarrow"
             android:launchMode="singleTop"
-            android:clearTaskOnLaunch="true">
-            <!-- TODO: Remove this temporary intent action name when the fragmentization
-                 work is done. -->
-            <intent-filter>
-                <action android:name="com.android.phone.action.GROUPS_LIST" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.TAB" />
-            </intent-filter>
-        </activity>
+            android:clearTaskOnLaunch="true"/>
 
         <!-- Views the details of a single group -->
         <activity android:name=".activities.GroupDetailActivity"
             android:label=""
-            android:theme="@style/GroupDetailTheme"
-            android:uiOptions="splitActionBarWhenNarrow"/>
+            android:theme="@style/DetailActivityTheme"/>
 
         <!-- Create a new or edit an existing group -->
         <activity
@@ -485,7 +475,7 @@
         <!-- Views the details of a single contact -->
         <activity android:name=".activities.ContactDetailActivity"
             android:label="@string/viewContactTitle"
-            android:theme="@style/ContactDetailActivityTheme">
+            android:theme="@style/DetailActivityTheme">
 
             <intent-filter android:label="@string/viewContactDesription">
                 <action android:name="android.intent.action.VIEW" />
diff --git a/res/drawable-hdpi/panel_content.9.png b/res/drawable-hdpi/panel_content.9.png
index 8c412ed..5c3090d 100644
--- a/res/drawable-hdpi/panel_content.9.png
+++ b/res/drawable-hdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-hdpi/panel_message.9.png b/res/drawable-hdpi/panel_message.9.png
index 796a8fa..caa3f60 100644
--- a/res/drawable-hdpi/panel_message.9.png
+++ b/res/drawable-hdpi/panel_message.9.png
Binary files differ
diff --git a/res/drawable-mdpi/panel_content.9.png b/res/drawable-mdpi/panel_content.9.png
index 12604ad..c5d2545 100644
--- a/res/drawable-mdpi/panel_content.9.png
+++ b/res/drawable-mdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-mdpi/panel_message.9.png b/res/drawable-mdpi/panel_message.9.png
index 529c61d..de74565 100644
--- a/res/drawable-mdpi/panel_message.9.png
+++ b/res/drawable-mdpi/panel_message.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/panel_content.9.png b/res/drawable-xhdpi/panel_content.9.png
index e0b20de..6acbbb1 100644
--- a/res/drawable-xhdpi/panel_content.9.png
+++ b/res/drawable-xhdpi/panel_content.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/panel_message.9.png b/res/drawable-xhdpi/panel_message.9.png
index ce3c06d..30a7bc3 100644
--- a/res/drawable-xhdpi/panel_message.9.png
+++ b/res/drawable-xhdpi/panel_message.9.png
Binary files differ
diff --git a/res/drawable/quickcontact_list_item_background.xml b/res/drawable/quickcontact_list_item_background.xml
index e6d773e..afb3947 100644
--- a/res/drawable/quickcontact_list_item_background.xml
+++ b/res/drawable/quickcontact_list_item_background.xml
@@ -14,7 +14,6 @@
      limitations under the License.
 -->
 
-<!-- TODO These all have to be refined -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item
         android:state_window_focused="false"
@@ -31,5 +30,5 @@
         android:state_focused="true"
         android:drawable="@drawable/list_focused_holo" />
     <item
-        android:drawable="@color/people_app_theme_color" />
+        android:drawable="@color/quickcontact_list_background" />
 </selector>
diff --git a/res/layout-sw580dp-w1000dp/group_detail_fragment.xml b/res/layout-sw580dp-w1000dp/group_detail_fragment.xml
index 4f2fb9e..45419a8 100644
--- a/res/layout-sw580dp-w1000dp/group_detail_fragment.xml
+++ b/res/layout-sw580dp-w1000dp/group_detail_fragment.xml
@@ -27,8 +27,6 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingTop="12dip"
-        android:paddingBottom="12dip"
         android:orientation="horizontal" >
 
         <LinearLayout
@@ -42,6 +40,7 @@
                 android:id="@+id/group_title"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:paddingTop="12dip"
                 android:paddingLeft="8dip"
                 android:textAppearance="?android:attr/textAppearanceLarge"
                 android:textStyle="bold" />
@@ -50,6 +49,7 @@
                 android:id="@+id/group_size"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:paddingBottom="12dip"
                 android:paddingLeft="8dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:textColor="?android:attr/textColorSecondary" />
@@ -60,7 +60,6 @@
             android:id="@+id/group_source_view_container"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
             android:paddingRight="@dimen/group_detail_border_padding" />
 
     </LinearLayout>
diff --git a/res/layout-sw580dp/group_detail_fragment.xml b/res/layout-sw580dp/group_detail_fragment.xml
index 99a60f3..90ca03a 100644
--- a/res/layout-sw580dp/group_detail_fragment.xml
+++ b/res/layout-sw580dp/group_detail_fragment.xml
@@ -50,7 +50,7 @@
 
     <FrameLayout
         android:id="@+id/group_source_view_container"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical" />
 
diff --git a/res/layout-sw580dp/group_source_button.xml b/res/layout-sw580dp/group_source_button.xml
index 6b0b8fe..a058990 100644
--- a/res/layout-sw580dp/group_source_button.xml
+++ b/res/layout-sw580dp/group_source_button.xml
@@ -24,6 +24,7 @@
     android:id="@+id/group_source"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
+    android:layout_gravity="center_vertical"
     android:background="?android:attr/selectableItemBackground"
     android:padding="10dip" >
 
diff --git a/res/layout-sw580dp/quickcontact_activity.xml b/res/layout-sw580dp/quickcontact_activity.xml
index 21b5ad2..8c8bfae 100644
--- a/res/layout-sw580dp/quickcontact_activity.xml
+++ b/res/layout-sw580dp/quickcontact_activity.xml
@@ -32,12 +32,12 @@
             android:layout_height="200dip">
             <include layout="@layout/quickcontact_photo_container" />
         </FrameLayout>
+        <include layout="@layout/quickcontact_track" />
         <View
-            android:id="@+id/line_before_track"
+            android:id="@+id/line_after_track"
             android:layout_width="match_parent"
             android:layout_height="2dip"
-            android:background="@color/quickcontact_list_background" />
-        <include layout="@layout/quickcontact_track" />
+            android:background="@color/quickcontact_tab_indicator" />
         <android.support.v4.view.ViewPager
             android:id="@+id/item_list_pager"
             android:layout_width="match_parent"
diff --git a/res/layout-w470dp/group_source_button.xml b/res/layout-w470dp/group_source_button.xml
index 4e8838e..fb57e83 100644
--- a/res/layout-w470dp/group_source_button.xml
+++ b/res/layout-w470dp/group_source_button.xml
@@ -27,10 +27,10 @@
     android:divider="?android:attr/dividerVertical"
     android:showDividers="end"
     android:dividerPadding="12dip"
-    android:orientation="horizontal">
+    android:orientation="horizontal"
+    style="?android:attr/actionButtonStyle">
 
     <LinearLayout
-        style="?android:attr/actionButtonStyle"
         android:id="@+id/group_source"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
@@ -52,7 +52,7 @@
             android:layout_height="25dip"
             android:layout_marginLeft="7dip"
             android:layout_marginRight="7dip"
-            android:layout_centerVertical="true"/>
+            android:layout_gravity="center_vertical"/>
 
     </LinearLayout>
 
diff --git a/res/layout-w470dp/quickcontact_activity.xml b/res/layout-w470dp/quickcontact_activity.xml
index 36d499d..dbd5260 100644
--- a/res/layout-w470dp/quickcontact_activity.xml
+++ b/res/layout-w470dp/quickcontact_activity.xml
@@ -42,6 +42,11 @@
             android:layout_height="match_parent"
             android:orientation="vertical">
             <include layout="@layout/quickcontact_track" />
+            <View
+                android:id="@+id/line_after_track"
+                android:layout_width="match_parent"
+                android:layout_height="2dip"
+                android:background="@color/quickcontact_tab_indicator" />
             <android.support.v4.view.ViewPager
                 android:id="@+id/item_list_pager"
                 android:background="@color/quickcontact_list_background"
diff --git a/res/layout/directory_header.xml b/res/layout/directory_header.xml
index 6043c7b..a1516ef 100644
--- a/res/layout/directory_header.xml
+++ b/res/layout/directory_header.xml
@@ -24,25 +24,12 @@
     android:paddingLeft="?attr/list_item_padding_left"
     android:paddingRight="?attr/list_item_padding_right">
     <TextView
-        android:id="@+id/display_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_toRightOf="@+id/label"
-        android:layout_toLeftOf="@+id/count"
-        android:layout_centerVertical="true"
-        android:layout_marginLeft="8dip"
-        android:layout_marginRight="8dip"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="?android:attr/textColorSecondary"
-        android:singleLine="true"
-        android:textStyle="bold"
-        android:textAllCaps="true" />
-    <TextView
         android:id="@+id/label"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
         android:layout_alignParentLeft="true"
-        android:layout_alignBaseline="@id/display_name"
+        android:layout_centerVertical="true"
         android:layout_marginLeft="8dip"
         android:textAppearance="?android:attr/textAppearanceSmall"
         android:textColor="?android:attr/textColorSecondary"
@@ -54,10 +41,24 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentRight="true"
-        android:layout_alignBaseline="@id/display_name"
+        android:layout_alignBaseline="@id/label"
         android:singleLine="true"
         android:textSize="12sp"
         android:textColor="@color/contact_count_text_color" />
+    <TextView
+        android:id="@+id/display_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toRightOf="@id/label"
+        android:layout_toLeftOf="@id/count"
+        android:layout_alignBaseline="@id/label"
+        android:layout_marginLeft="8dip"
+        android:layout_marginRight="8dip"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary"
+        android:singleLine="true"
+        android:textStyle="bold"
+        android:textAllCaps="true" />
     <View
         android:id="@+id/contact_filter_header_bottom_divider"
         style="@style/SectionDivider"
diff --git a/res/layout/group_detail_fragment.xml b/res/layout/group_detail_fragment.xml
index c29355e..34eb285 100644
--- a/res/layout/group_detail_fragment.xml
+++ b/res/layout/group_detail_fragment.xml
@@ -22,7 +22,7 @@
 
     <FrameLayout
         android:id="@+id/group_source_view_container"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical" />
 
diff --git a/res/layout/group_member_suggestion.xml b/res/layout/group_member_suggestion.xml
index 2cecf87..c6c3877 100644
--- a/res/layout/group_member_suggestion.xml
+++ b/res/layout/group_member_suggestion.xml
@@ -20,37 +20,43 @@
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
+    android:layout_height="48dip"
     android:orientation="horizontal"
-    android:padding="10dip" >
+    android:gravity="center_vertical"
+    android:background="?android:attr/selectableItemBackground">
+
+    <LinearLayout
+        android:layout_width="0dip"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center_vertical"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/text1"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingLeft="8dip"
+            android:singleLine="true"
+            android:ellipsize="end"/>
+
+        <TextView android:id="@+id/text2"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorSecondary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingLeft="8dip"
+            android:singleLine="true"
+            android:ellipsize="end" />
+
+    </LinearLayout>
 
     <ImageView
         android:id="@+id/icon"
         android:layout_width="48dip"
         android:layout_height="48dip"
-        android:scaleType="centerInside"
-        android:layout_gravity="center" />
+        android:cropToPadding="true"
+        android:scaleType="centerCrop" />
 
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:paddingLeft="10dip" >
-
-        <TextView
-            android:id="@+id/text1"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:singleLine="true"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" />
-
-        <TextView
-            android:id="@+id/text2"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:singleLine="true"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" />
-
-    </LinearLayout>
-
-</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/quickcontact_activity.xml b/res/layout/quickcontact_activity.xml
index 2f5a357..c8d0ad4 100644
--- a/res/layout/quickcontact_activity.xml
+++ b/res/layout/quickcontact_activity.xml
@@ -38,12 +38,12 @@
             ex:direction="widthToHeight">
             <include layout="@layout/quickcontact_photo_container" />
         </view>
+        <include layout="@layout/quickcontact_track" />
         <View
-            android:id="@+id/line_before_track"
+            android:id="@+id/line_after_track"
             android:layout_width="match_parent"
             android:layout_height="2dip"
-            android:background="@color/quickcontact_list_background" />
-        <include layout="@layout/quickcontact_track" />
+            android:background="@color/quickcontact_tab_indicator" />
         <android.support.v4.view.ViewPager
             android:id="@+id/item_list_pager"
             android:layout_width="match_parent"
diff --git a/res/layout/quickcontact_list_item.xml b/res/layout/quickcontact_list_item.xml
index 4ffa091..7929718 100755
--- a/res/layout/quickcontact_list_item.xml
+++ b/res/layout/quickcontact_list_item.xml
@@ -36,28 +36,30 @@
             android:id="@android:id/text1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textColor="@android:color/white"
+            android:textColor="@color/primary_text_color"
             android:textAppearance="?android:attr/textAppearanceMedium" />
         <TextView
             android:id="@android:id/text2"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textColor="@android:color/white"
+            android:textColor="@color/primary_text_color"
             android:textAllCaps="true"
             android:textAppearance="?android:attr/textAppearanceSmall" />
     </LinearLayout>
     <View
         android:id="@+id/vertical_divider"
         android:layout_width="1dip"
-        android:layout_height="wrap_content"
+        android:layout_height="match_parent"
         android:layout_gravity="center_vertical"
-        android:background="@drawable/ic_divider_dashed_holo_dark" />
+        android:layout_marginTop="@dimen/detail_vertical_divider_vertical_margin"
+        android:layout_marginBottom="@dimen/detail_vertical_divider_vertical_margin"
+        android:background="?android:attr/dividerVertical" />
     <ImageView
         android:id="@+id/secondary_action_button"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:paddingLeft="@dimen/detail_item_icon_margin"
         android:paddingRight="@dimen/detail_item_icon_margin"
-        android:background="@drawable/quickcontact_list_item_background"
+        android:background="?android:attr/selectableItemBackground"
         android:duplicateParentState="false" />
 </LinearLayout>
diff --git a/res/layout/quickcontact_track.xml b/res/layout/quickcontact_track.xml
index 8177174..bf25cb3 100644
--- a/res/layout/quickcontact_track.xml
+++ b/res/layout/quickcontact_track.xml
@@ -33,10 +33,10 @@
             <View
                 android:id="@+id/selected_tab_rectangle"
                 android:layout_width="60dip"
-                android:layout_height="8dip"
+                android:layout_height="6dip"
                 android:layout_alignBottom="@id/track"
                 android:layout_alignParentLeft="true"
-                android:background="@color/quickcontact_list_background" />
+                android:background="@color/quickcontact_tab_indicator" />
         </RelativeLayout>
     </HorizontalScrollView>
 </merge>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index 2c83f6b..8a2fd91 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -16,6 +16,7 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
     <item
         android:id="@+id/search_on_action_bar"
+        android:title="@string/menu_search"
         android:icon="@android:drawable/ic_menu_search"
         android:showAsAction="always" />
 
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index d5f5e58..34c89fc 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -18,6 +18,7 @@
     <dimen name="action_bar_filter_max_width">300dip</dimen>
     <dimen name="action_bar_search_max_width">336dip</dimen>
     <dimen name="action_bar_search_spacing">32dip</dimen>
+    <dimen name="group_detail_border_padding">32dip</dimen>
     <dimen name="detail_header_view_margin">16dip</dimen>
     <dimen name="detail_header_attribution_height">56dip</dimen>
     <dimen name="detail_update_section_top_padding">48dip</dimen>
diff --git a/res/values-sw580dp-w720dp/styles.xml b/res/values-sw580dp-w720dp/styles.xml
index 69548c5..151b173 100644
--- a/res/values-sw580dp-w720dp/styles.xml
+++ b/res/values-sw580dp-w720dp/styles.xml
@@ -16,6 +16,7 @@
 <resources>
     <style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
         <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
+        <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
         <item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
         <item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
         <item name="android:textColorPrimary">@color/primary_text_color</item>
@@ -32,7 +33,7 @@
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_call_button_padding">14dip</item>
         <item name="list_item_vertical_divider_margin">5dip</item>
-        <item name="list_item_presence_icon_margin">30dip</item>
+        <item name="list_item_presence_icon_margin">4dip</item>
         <item name="list_item_photo_size">64dip</item>
         <item name="list_item_profile_photo_size">80dip</item>
         <item name="list_item_prefix_highlight_color">#729a27</item>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index 440929a..c75ba6e 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -31,6 +31,7 @@
     <dimen name="action_bar_search_spacing">12dip</dimen>
     <dimen name="shortcut_icon_size">64dip</dimen>
     <dimen name="list_section_height">37dip</dimen>
+    <dimen name="group_detail_border_padding">16dip</dimen>
     <dimen name="detail_update_section_side_padding">0dip</dimen>
     <dimen name="detail_update_section_item_horizontal_padding">8dip</dimen>
     <dimen name="detail_update_section_item_vertical_padding">32dip</dimen>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 0a62db2..4029401 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -16,6 +16,7 @@
 <resources>
     <style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
         <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
+        <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
         <item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
         <item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
         <item name="android:textColorPrimary">@color/primary_text_color</item>
@@ -32,7 +33,7 @@
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_call_button_padding">14dip</item>
         <item name="list_item_vertical_divider_margin">5dip</item>
-        <item name="list_item_presence_icon_margin">18dip</item>
+        <item name="list_item_presence_icon_margin">4dip</item>
         <item name="list_item_photo_size">64dip</item>
         <item name="list_item_profile_photo_size">80dip</item>
         <item name="list_item_prefix_highlight_color">#729a27</item>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 64d7dfb..0b8f1b7 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -17,8 +17,9 @@
     <color name="textColorIconOverlay">#fff</color>
     <color name="textColorIconOverlayShadow">#000</color>
 
-    <color name="quickcontact_list_divider">#ff48bde8</color>
-    <color name="quickcontact_list_background">#ff33b5e6</color>
+    <color name="quickcontact_list_divider">#ffcdcdcd</color>
+    <color name="quickcontact_list_background">#ffe2e2e2</color>
+    <color name="quickcontact_tab_indicator">#ff33b5e6</color>
 
     <color name="edit_divider">#ff666666</color>
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 03a9134..aa421f1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -77,7 +77,7 @@
         <item name="call_log_voicemail_status_text_color">#000000</item>
     </style>
 
-    <style name="ContactDetailActivityTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
+    <style name="DetailActivityTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
         <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
         <item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
         <item name="android:textColorPrimary">@color/primary_text_color</item>
@@ -128,6 +128,7 @@
     <style name="PeopleTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
         <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
         <item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
+        <item name="android:actionBarWidgetTheme">@style/ContactsActionBarTheme</item>
         <item name="android:actionBarTabStyle">@style/ContactsActionBarTabView</item>
         <item name="android:textColorPrimary">@color/primary_text_color</item>
         <item name="android:textColorSecondary">@color/secondary_text_color</item>
@@ -171,39 +172,12 @@
         <item name="android:displayOptions"></item>
     </style>
 
-    <style name="ContactsActionBarTabView" parent="@android:style/Widget.Holo.ActionBar.TabView">
-        <item name="android:background">@drawable/action_bar_tab</item>
+    <style name="ContactsActionBarTheme" parent="@android:style/Theme.Holo">
+        <item name="android:textColorHint">#CCCCCC</item>
     </style>
 
-    <!-- TODO: Clean up this file so themes aren't copied. -->
-    <style name="GroupDetailTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
-        <item name="android:actionBarStyle">@style/ContactsActionBarStyle</item>
-        <item name="android:actionBarItemBackground">@drawable/action_bar_item_background</item>
-        <item name="android:textColorPrimary">@color/primary_text_color</item>
-        <item name="android:textColorSecondary">@color/secondary_text_color</item>
-        <item name="list_item_height">?android:attr/listPreferredItemHeight</item>
-        <item name="activated_background">@drawable/list_item_activated_background</item>
-        <item name="section_header_background">@drawable/list_title_holo</item>
-        <item name="list_section_header_height">32dip</item>
-        <item name="list_item_divider">?android:attr/listDivider</item>
-        <item name="list_item_padding_top">4dip</item>
-        <item name="list_item_padding_right">11dip</item>
-        <item name="list_item_padding_bottom">4dip</item>
-        <item name="list_item_padding_left">4dip</item>
-        <item name="list_item_gap_between_image_and_text">8dip</item>
-        <item name="list_item_gap_between_label_and_data">5dip</item>
-        <item name="list_item_call_button_padding">14dip</item>
-        <item name="list_item_vertical_divider_margin">5dip</item>
-        <item name="list_item_presence_icon_margin">5dip</item>
-        <item name="list_item_photo_size">@dimen/contact_browser_list_item_photo_size</item>
-        <item name="list_item_profile_photo_size">70dip</item>
-        <item name="list_item_prefix_highlight_color">#729a27</item>
-        <item name="list_item_header_text_color">?color/section_header_text_color</item>
-        <item name="list_item_header_text_size">14sp</item>
-        <item name="list_item_header_text_indent">8dip</item>
-        <item name="contact_browser_list_padding_left">16dip</item>
-        <item name="contact_browser_list_padding_right">0dip</item>
-        <item name="contact_browser_background">@android:color/transparent</item>
+    <style name="ContactsActionBarTabView" parent="@android:style/Widget.Holo.ActionBar.TabView">
+        <item name="android:background">@drawable/action_bar_tab</item>
     </style>
 
     <style name="ContactPickerTheme" parent="@style/PeopleTheme">
diff --git a/src/com/android/contacts/PhoneCallDetails.java b/src/com/android/contacts/PhoneCallDetails.java
index 78ac9b3..547695c 100644
--- a/src/com/android/contacts/PhoneCallDetails.java
+++ b/src/com/android/contacts/PhoneCallDetails.java
@@ -53,6 +53,8 @@
     /**
      * The photo URI of the picture of the contact that is associated with this phone call or
      * null if there is none.
+     * <p>
+     * This is meant to store the high-res photo only.
      */
     public final Uri photoUri;
 
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 09f4f1c..edf5519 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -107,8 +107,8 @@
         mShowHomeIcon = mContext.getResources().getBoolean(R.bool.show_home_icon);
 
         // Set up search view.
-        View customSearchView = LayoutInflater.from(mContext).inflate(R.layout.custom_action_bar,
-                null);
+        View customSearchView = LayoutInflater.from(mActionBar.getThemedContext()).inflate(
+                R.layout.custom_action_bar, null);
         int searchViewWidth = mContext.getResources().getDimensionPixelSize(
                 R.dimen.search_view_width);
         if (searchViewWidth == 0) {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 1c69ef9..1bab98d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -1045,6 +1045,8 @@
         @Override
         public void onDetailsLoaded(final ContactLoader.Result result) {
             if (result == null) {
+                // Nothing is loaded. Show empty state.
+                mContactDetailLayoutController.showEmptyState();
                 return;
             }
             // Since {@link FragmentTransaction}s cannot be done in the onLoadFinished() of the
diff --git a/src/com/android/contacts/calllog/CallLogAdapter.java b/src/com/android/contacts/calllog/CallLogAdapter.java
index bed721a..7cd73a5 100644
--- a/src/com/android/contacts/calllog/CallLogAdapter.java
+++ b/src/com/android/contacts/calllog/CallLogAdapter.java
@@ -329,11 +329,8 @@
                 info.number = dataTableCursor.getString(
                         dataTableCursor.getColumnIndex(Data.DATA1));
                 info.normalizedNumber = null;  // meaningless for SIP addresses
-                final String thumbnailUriString = dataTableCursor.getString(
-                        dataTableCursor.getColumnIndex(Data.PHOTO_THUMBNAIL_URI));
-                info.thumbnailUri = thumbnailUriString == null
-                        ? null
-                        : Uri.parse(thumbnailUriString);
+                info.photoId = dataTableCursor.getLong(
+                        dataTableCursor.getColumnIndex(Data.PHOTO_ID));
             } else {
                 info = ContactInfo.EMPTY;
             }
@@ -377,11 +374,7 @@
                         .getString(PhoneQuery.MATCHED_NUMBER);
                 info.normalizedNumber = phonesCursor
                         .getString(PhoneQuery.NORMALIZED_NUMBER);
-                final String thumbnailUriString = phonesCursor.getString(
-                        PhoneQuery.THUMBNAIL_URI);
-                info.thumbnailUri = thumbnailUriString == null
-                        ? null
-                        : Uri.parse(thumbnailUriString);
+                info.photoId = phonesCursor.getLong(PhoneQuery.PHOTO_ID);
             } else {
                 info = ContactInfo.EMPTY;
             }
@@ -635,7 +628,7 @@
         final String name = info.name;
         final int ntype = info.type;
         final String label = info.label;
-        final Uri thumbnailUri = info.thumbnailUri;
+        final long photoId = info.photoId;
         final int[] callTypes = getCallTypes(c, count);
         final String geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
         final PhoneCallDetails details;
@@ -643,15 +636,16 @@
             details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
                     callTypes, date, duration);
         } else {
+            // We do not pass a photo id since we do not need the high-res picture.
             details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
-                    callTypes, date, duration, name, ntype, label, contactUri , thumbnailUri);
+                    callTypes, date, duration, name, ntype, label, contactUri, null);
         }
 
         final boolean isNew = CallLogQuery.isNewSection(c);
         // New items also use the highlighted version of the text.
         final boolean isHighlighted = isNew;
         mCallLogViewsHelper.setPhoneCallDetails(views, details, isHighlighted);
-        setPhoto(views, thumbnailUri, contactUri);
+        setPhoto(views, photoId, contactUri);
 
         // Listen for the first draw
         if (mPreDrawListener == null) {
@@ -718,7 +712,7 @@
         info.number = c.getString(CallLogQuery.NUMBER);
         info.formattedNumber = info.number;
         info.normalizedNumber = info.number;
-        info.thumbnailUri = null;
+        info.photoId = 0;
         return info;
     }
 
@@ -740,9 +734,9 @@
         return callTypes;
     }
 
-    private void setPhoto(CallLogListItemViews views, Uri thumbnailUri, Uri contactUri) {
+    private void setPhoto(CallLogListItemViews views, long photoId, Uri contactUri) {
         views.quickContactView.assignContactUri(contactUri);
-        mContactPhotoManager.loadPhoto(views.quickContactView, thumbnailUri);
+        mContactPhotoManager.loadPhoto(views.quickContactView, photoId);
     }
 
     /**
diff --git a/src/com/android/contacts/calllog/ContactInfo.java b/src/com/android/contacts/calllog/ContactInfo.java
index 58c5f6a..c28018c 100644
--- a/src/com/android/contacts/calllog/ContactInfo.java
+++ b/src/com/android/contacts/calllog/ContactInfo.java
@@ -32,7 +32,8 @@
     public String number;
     public String formattedNumber;
     public String normalizedNumber;
-    public Uri thumbnailUri;
+    /** The photo for the contact, if available. */
+    public long photoId;
 
     public static ContactInfo EMPTY = new ContactInfo();
 
@@ -61,7 +62,7 @@
         if (!TextUtils.equals(number, other.number)) return false;
         // Ignore formatted number.
         if (!TextUtils.equals(normalizedNumber, other.normalizedNumber)) return false;
-        if (!UriUtils.areEqual(thumbnailUri, other.thumbnailUri)) return false;
+        if (photoId != other.photoId) return false;
         return true;
     }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/calllog/PhoneQuery.java b/src/com/android/contacts/calllog/PhoneQuery.java
index 52faa8b..a53e5c8 100644
--- a/src/com/android/contacts/calllog/PhoneQuery.java
+++ b/src/com/android/contacts/calllog/PhoneQuery.java
@@ -29,7 +29,7 @@
             PhoneLookup.LABEL,
             PhoneLookup.NUMBER,
             PhoneLookup.NORMALIZED_NUMBER,
-            PhoneLookup.PHOTO_THUMBNAIL_URI,
+            PhoneLookup.PHOTO_ID,
             PhoneLookup.LOOKUP_KEY};
 
     public static final int PERSON_ID = 0;
@@ -38,6 +38,6 @@
     public static final int LABEL = 3;
     public static final int MATCHED_NUMBER = 4;
     public static final int NORMALIZED_NUMBER = 5;
-    public static final int THUMBNAIL_URI = 6;
+    public static final int PHOTO_ID = 6;
     public static final int LOOKUP_KEY = 7;
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index 6bca80d..5d6c7d5 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -129,16 +129,11 @@
     }
 
     /**
-     * Returns the attribution string for the contact. This could either specify
-     * that this is a joined contact or specify the contact directory that the
-     * contact came from. Returns null if there is none applicable.
+     * Returns the attribution string for the contact, which may specify the contact directory that
+     * the contact came from. Returns null if there is none applicable.
      */
     public static String getAttribution(Context context, Result contactData) {
-        // Check if this is a joined contact
-        if (contactData.getEntities().size() > 1) {
-            return context.getString(R.string.indicator_joined_contact);
-        } else if (contactData.isDirectoryEntry()) {
-            // This contact is from a directory
+        if (contactData.isDirectoryEntry()) {
             String directoryDisplayName = contactData.getDirectoryDisplayName();
             String directoryType = contactData.getDirectoryType();
             String displayName = !TextUtils.isEmpty(directoryDisplayName)
@@ -193,7 +188,6 @@
         return null;
     }
 
-
     /**
      * Sets the contact photo to display in the given {@link ImageView}. If bitmap is null, the
      * default placeholder image is shown.
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index daf8229..b2e20ca 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -371,6 +371,10 @@
         mShowStaticPhoto = showPhoto;
     }
 
+    public void showEmptyState() {
+        setData(null, null);
+    }
+
     public void setData(Uri lookupUri, ContactLoader.Result result) {
         mLookupUri = lookupUri;
         mContactData = result;
@@ -412,6 +416,10 @@
 
         if (mContactData == null) {
             mView.setVisibility(View.INVISIBLE);
+            mAllEntries.clear();
+            if (mAdapter != null) {
+                mAdapter.notifyDataSetChanged();
+            }
             return;
         }
 
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index 579d7bf..f9d6443 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -233,6 +233,33 @@
         }
     }
 
+    public void showEmptyState() {
+        switch (mLayoutMode) {
+            case FRAGMENT_CAROUSEL: {
+                mFragmentCarousel.enableSwipe(false);
+                mDetailFragment.showEmptyState();
+                break;
+            }
+            case TWO_COLUMN: {
+                mDetailFragment.setShowStaticPhoto(false);
+                mUpdatesFragmentView.setVisibility(View.GONE);
+                mDetailFragment.showEmptyState();
+                break;
+            }
+            case 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);
+        }
+    }
+
     /**
      * Setup the layout for the contact with updates. Pass in the index of the current page to
      * select or null if the current selection should be left as is.
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index eef5a61..e3e8875 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -96,6 +96,10 @@
         public void onSearchButtonPressed();
     }
 
+    /**
+     * View (usually FrameLayout) containing mDigits field. This can be null, in which mDigits
+     * isn't enclosed by the container.
+     */
     private View mDigitsContainer;
     private EditText mDigits;
 
@@ -931,7 +935,12 @@
 
         if (enabled) {
             // Log.i(TAG, "Showing dialpad chooser!");
-            mDigitsContainer.setVisibility(View.GONE);
+            if (mDigitsContainer != null) {
+                mDigitsContainer.setVisibility(View.GONE);
+            } else {
+                // mDigits is not enclosed by the container. Make the digits field itself gone.
+                mDigits.setVisibility(View.GONE);
+            }
             if (mDialpad != null) mDialpad.setVisibility(View.GONE);
             mAdditionalButtonsRow.setVisibility(View.GONE);
             mDialpadChooser.setVisibility(View.VISIBLE);
@@ -944,7 +953,11 @@
             mDialpadChooser.setAdapter(mDialpadChooserAdapter);
         } else {
             // Log.i(TAG, "Displaying normal Dialer UI.");
-            mDigitsContainer.setVisibility(View.VISIBLE);
+            if (mDigitsContainer != null) {
+                mDigitsContainer.setVisibility(View.VISIBLE);
+            } else {
+                mDigits.setVisibility(View.VISIBLE);
+            }
             if (mDialpad != null) mDialpad.setVisibility(View.VISIBLE);
             mAdditionalButtonsRow.setVisibility(View.VISIBLE);
             mDialpadChooser.setVisibility(View.GONE);
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index 49835ef..2b9c594 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -101,6 +101,15 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
+        if (savedInstanceState != null) {
+            mSelectedGroupUri = savedInstanceState.getParcelable(EXTRA_KEY_GROUP_URI);
+            if (mSelectedGroupUri != null) {
+                // The selection may be out of screen, if rotated from portrait to landscape,
+                // so ensure it's visible.
+                mSelectionToScreenRequested = true;
+            }
+        }
+
         mRootView = inflater.inflate(R.layout.group_browse_list_fragment, null);
         mEmptyView = (TextView)mRootView.findViewById(R.id.empty);
 
@@ -137,12 +146,6 @@
         });
         setAddAccountsVisibility(!ContactsUtils.areAccountsAvailable(mContext));
 
-        if (savedInstanceState != null) {
-            String groupUriString = savedInstanceState.getString(EXTRA_KEY_GROUP_URI);
-            if (groupUriString != null) {
-                mSelectedGroupUri = Uri.parse(groupUriString);
-            }
-        }
         return mRootView;
     }
 
@@ -300,12 +303,7 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
-        if (mSelectedGroupUri != null) {
-            String uriString = mSelectedGroupUri.toString();
-            if (!TextUtils.isEmpty(uriString)) {
-                outState.putString(EXTRA_KEY_GROUP_URI, uriString);
-            }
-        }
+        outState.putParcelable(EXTRA_KEY_GROUP_URI, mSelectedGroupUri);
     }
 
     public void setAddAccountsVisibility(boolean visible) {
diff --git a/src/com/android/contacts/group/SuggestedMemberListAdapter.java b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
index bc8055a..623b5a2 100644
--- a/src/com/android/contacts/group/SuggestedMemberListAdapter.java
+++ b/src/com/android/contacts/group/SuggestedMemberListAdapter.java
@@ -173,7 +173,11 @@
                 return results;
             }
 
-            // Map of raw contact IDs to {@link SuggestedMember} objects
+            // Create a list to store the suggested contacts (which will be alphabetically ordered),
+            // but also keep a map of raw contact IDs to {@link SuggestedMember}s to make it easier
+            // to add supplementary data to the contact (photo, phone, email) to the members based
+            // on raw contact IDs after the second query is completed.
+            List<SuggestedMember> suggestionsList = new ArrayList<SuggestedMember>();
             HashMap<Long, SuggestedMember> suggestionsMap = new HashMap<Long, SuggestedMember>();
 
             // First query for all the raw contacts that match the given search query
@@ -197,7 +201,7 @@
                     accountClause + " AND (" +
                     RawContacts.DISPLAY_NAME_PRIMARY + " LIKE ? OR " +
                     RawContacts.DISPLAY_NAME_ALTERNATIVE + " LIKE ? )",
-                    args, null);
+                    args, RawContacts.DISPLAY_NAME_PRIMARY + " COLLATE LOCALIZED ASC");
 
             if (cursor == null) {
                 return results;
@@ -216,8 +220,11 @@
                     }
                     // Otherwise, add the contact as a suggested new group member
                     String displayName = cursor.getString(DISPLAY_NAME_PRIMARY_COLUMN_INDEX);
-                    suggestionsMap.put(rawContactId, new SuggestedMember(rawContactId,
-                            displayName, contactId));
+                    SuggestedMember member = new SuggestedMember(rawContactId, displayName,
+                            contactId);
+                    // Store the member in the list of suggestions and add it to the hash map too.
+                    suggestionsList.add(member);
+                    suggestionsMap.put(rawContactId, member);
                 }
             } finally {
                 cursor.close();
@@ -282,14 +289,14 @@
             } finally {
                 memberDataCursor.close();
             }
-            results.values = suggestionsMap;
+            results.values = suggestionsList;
             return results;
         }
 
         @Override
         protected void publishResults(CharSequence constraint, FilterResults results) {
-            HashMap<Long, SuggestedMember> map = (HashMap<Long, SuggestedMember>) results.values;
-            if (map == null || map.keySet() == null) {
+            List<SuggestedMember> suggestionsList = (List<SuggestedMember>) results.values;
+            if (suggestionsList == null) {
                 return;
             }
 
@@ -297,7 +304,7 @@
             clear();
 
             // Add all the suggested members to this adapter
-            for (SuggestedMember member : map.values()) {
+            for (SuggestedMember member : suggestionsList) {
                 add(member);
             }
 
diff --git a/src/com/android/contacts/interactions/GroupNameDialogFragment.java b/src/com/android/contacts/interactions/GroupNameDialogFragment.java
index 93500be..3c65562 100644
--- a/src/com/android/contacts/interactions/GroupNameDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupNameDialogFragment.java
@@ -76,7 +76,10 @@
     @Override
     public void afterTextChanged(Editable s) {
         AlertDialog dialog = (AlertDialog) getDialog();
-        updateOkButtonState(dialog);
+        // Make sure the dialog has not already been dismissed or destroyed.
+        if (dialog != null) {
+            updateOkButtonState(dialog);
+        }
     }
 
     private void updateOkButtonState(AlertDialog dialog) {
diff --git a/src/com/android/contacts/list/ContactListItemView.java b/src/com/android/contacts/list/ContactListItemView.java
index ce1b119..f16102d 100644
--- a/src/com/android/contacts/list/ContactListItemView.java
+++ b/src/com/android/contacts/list/ContactListItemView.java
@@ -934,7 +934,7 @@
             mStatusView.setSingleLine(true);
             mStatusView.setEllipsize(getTextEllipsis());
             mStatusView.setTextAppearance(mContext, android.R.style.TextAppearance_Small);
-            mStatusView.setTextColor(Color.GRAY);
+            mStatusView.setTextColor(R.color.secondary_text_color);
             addView(mStatusView);
         }
         return mStatusView;
diff --git a/src/com/android/contacts/model/BaseAccountType.java b/src/com/android/contacts/model/BaseAccountType.java
index 0846197..aafa3ea 100644
--- a/src/com/android/contacts/model/BaseAccountType.java
+++ b/src/com/android/contacts/model/BaseAccountType.java
@@ -206,7 +206,6 @@
                 android.R.drawable.sym_action_call, 10, true,
                 R.layout.text_fields_editor_view, android.R.style.TextAppearance_Medium));
         kind.iconAltRes = R.drawable.ic_text_holo_light;
-        kind.iconAltResDark = R.drawable.ic_text_holo_dark;
         kind.actionHeader = new PhoneActionInflater();
         kind.actionAltHeader = new PhoneActionAltInflater();
         kind.actionBody = new SimpleInflater(Phone.NUMBER);
diff --git a/src/com/android/contacts/model/DataKind.java b/src/com/android/contacts/model/DataKind.java
index a3b31e3..40f6f99 100644
--- a/src/com/android/contacts/model/DataKind.java
+++ b/src/com/android/contacts/model/DataKind.java
@@ -27,10 +27,7 @@
     public String mimeType;
     public int titleRes;
     public int iconRes;
-    /** Icon used for secondary action when shown on top of a bright background */
     public int iconAltRes;
-    /** Icon used for secondary action when shown on top of a dark background */
-    public int iconAltResDark;
     public int weight;
     public boolean editable;
 
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 827016f..109e8b0 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -107,7 +107,7 @@
                     if (hasPhone && hasSms) {
                         mIntent = phoneIntent;
                         mAlternateIntent = smsIntent;
-                        mAlternateIconRes = kind.iconAltResDark;
+                        mAlternateIconRes = kind.iconAltRes;
                     } else if (hasPhone) {
                         mIntent = phoneIntent;
                     } else if (hasSms) {
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index af18917..f22369f 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -83,9 +83,6 @@
 
 // TODO: Save selected tab index during rotation
 
-// Missing assets and specs:
-//   Pushed states for list items
-
 /**
  * Mostly translucent {@link Activity} that shows QuickContact dialog. It loads
  * data asynchronously, and then shows a popup with details centered around
@@ -115,8 +112,7 @@
     private ViewGroup mTrack;
     private HorizontalScrollView mTrackScroller;
     private View mSelectedTabRectangle;
-    /** Line before the track. Depending on the layout, this can be null */
-    private View mLineBeforeTrack;
+    private View mLineAfterTrack;
 
     private ImageButton mOpenDetailsButton;
     private ImageButton mOpenDetailsPushLayerButton;
@@ -172,7 +168,7 @@
         mOpenDetailsPushLayerButton = (ImageButton) findViewById(R.id.open_details_push_layer);
         mListPager = (ViewPager) findViewById(R.id.item_list_pager);
         mSelectedTabRectangle = findViewById(R.id.selected_tab_rectangle);
-        mLineBeforeTrack = findViewById(R.id.line_before_track);
+        mLineAfterTrack = findViewById(R.id.line_after_track);
 
         mFloatingLayout.setOnOutsideTouchListener(new View.OnTouchListener() {
             @Override
@@ -540,11 +536,9 @@
         }
 
         final boolean hasData = !mSortedActionMimeTypes.isEmpty();
-        if (mLineBeforeTrack != null) {
-            mLineBeforeTrack.setVisibility(hasData ? View.VISIBLE : View.GONE);
-        }
         mTrackScroller.setVisibility(hasData ? View.VISIBLE : View.GONE);
         mSelectedTabRectangle.setVisibility(hasData ? View.VISIBLE : View.GONE);
+        mLineAfterTrack.setVisibility(hasData ? View.VISIBLE : View.GONE);
         mListPager.setVisibility(hasData ? View.VISIBLE : View.GONE);
     }
 
diff --git a/src/com/android/contacts/quickcontact/QuickContactListFragment.java b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
index 1c36ae1..7cbc7c8 100644
--- a/src/com/android/contacts/quickcontact/QuickContactListFragment.java
+++ b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
@@ -113,6 +113,7 @@
                 final boolean hasAlternateAction = action.getAlternateIntent() != null;
                 alternateActionDivider.setVisibility(hasAlternateAction ? View.VISIBLE : View.GONE);
                 alternateActionButton.setImageDrawable(action.getAlternateIcon());
+                alternateActionButton.setVisibility(hasAlternateAction ? View.VISIBLE : View.GONE);
 
                 text1.setText(action.getBody());
                 text2.setText(action.getSubtitle());
diff --git a/src/com/android/contacts/util/UriUtils.java b/src/com/android/contacts/util/UriUtils.java
index 28874f2..7ef8786 100644
--- a/src/com/android/contacts/util/UriUtils.java
+++ b/src/com/android/contacts/util/UriUtils.java
@@ -35,4 +35,12 @@
         }
         return uri1.equals(uri2);
     }
+
+    /** Parses a string into a URI and returns null if the given string is null. */
+    public static Uri parseUriOrNull(String uriString) {
+        if (uriString == null) {
+            return null;
+        }
+        return Uri.parse(uriString);
+    }
 }
diff --git a/tests/src/com/android/contacts/activities/CallLogActivityTests.java b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
index 0f43313..b148121 100644
--- a/tests/src/com/android/contacts/activities/CallLogActivityTests.java
+++ b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
@@ -68,8 +68,6 @@
 
     /** A test value for the URI of a contact. */
     private static final Uri TEST_CONTACT_URI = Uri.parse("content://contacts/2");
-    /** A test value for the photo uri of a contact. */
-    private static final Uri TEST_THUMBNAIL_URI = Uri.parse("something://picture/2");
     /** A test value for the country ISO of the phone number in the call log. */
     private static final String TEST_COUNTRY_ISO = "US";
     /** A phone number to be used in tests. */
@@ -462,7 +460,7 @@
         }
         contactInfo.formattedNumber = formattedNumber;
         contactInfo.normalizedNumber = number;
-        contactInfo.thumbnailUri = TEST_THUMBNAIL_URI;
+        contactInfo.photoId = 0;
         mAdapter.injectContactInfoForTest(number, contactInfo);
     }
 
diff --git a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
index 28db896..42733c9 100644
--- a/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogAdapterTest.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.database.MatrixCursor;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
 import android.view.View;
 
 import java.util.List;
@@ -28,6 +29,7 @@
 /**
  * Unit tests for {@link CallLogAdapter}.
  */
+@SmallTest
 public class CallLogAdapterTest extends AndroidTestCase {
     private static final String TEST_NUMBER = "12345678";
     private static final String TEST_NAME = "name";