am 4cec3445: (-s ours) am 301c7155: am 263b01dd: Changed dialer launch activity style to use a 0dp height actionbar. This prevents the user from seeing a blue "Phone" actionbar during loading.  DO NOT MERGE

* commit '4cec34455ee8ceae129fad4e2f13bb5c8961b7af':
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3a643a8..509960c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -15,7 +15,8 @@
 -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.dialer">
+    package="com.android.dialer"
+    coreApp="true">
 
     <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
diff --git a/res/drawable-hdpi/dialer_recent_card_bg.9.png b/res/drawable-hdpi/dialer_recent_card_bg.9.png
deleted file mode 100644
index 2bfdbcb..0000000
--- a/res/drawable-hdpi/dialer_recent_card_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_contacts_tiles.9.png b/res/drawable-hdpi/ic_contacts_tiles.9.png
new file mode 100644
index 0000000..572fdb8
--- /dev/null
+++ b/res/drawable-hdpi/ic_contacts_tiles.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_tile_for_recents_and_contact_tile.9.png b/res/drawable-hdpi/ic_tile_for_recents_and_contact_tile.9.png
new file mode 100644
index 0000000..b5f50de
--- /dev/null
+++ b/res/drawable-hdpi/ic_tile_for_recents_and_contact_tile.9.png
Binary files differ
diff --git a/res/drawable-mdpi/dialer_recent_card_bg.9.png b/res/drawable-mdpi/dialer_recent_card_bg.9.png
deleted file mode 100644
index dff6a0b..0000000
--- a/res/drawable-mdpi/dialer_recent_card_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_contacts_tiles.9.png b/res/drawable-mdpi/ic_contacts_tiles.9.png
new file mode 100644
index 0000000..343053a
--- /dev/null
+++ b/res/drawable-mdpi/ic_contacts_tiles.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_tile_for_recents_and_contact_tile.9.png b/res/drawable-mdpi/ic_tile_for_recents_and_contact_tile.9.png
new file mode 100644
index 0000000..e43b3ef
--- /dev/null
+++ b/res/drawable-mdpi/ic_tile_for_recents_and_contact_tile.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/dialer_recent_card_bg.9.png b/res/drawable-xhdpi/dialer_recent_card_bg.9.png
deleted file mode 100644
index 05d254d..0000000
--- a/res/drawable-xhdpi/dialer_recent_card_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_contacts_tiles.9.png b/res/drawable-xhdpi/ic_contacts_tiles.9.png
new file mode 100644
index 0000000..5a56587
--- /dev/null
+++ b/res/drawable-xhdpi/ic_contacts_tiles.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_tile_for_recents_and_contact_tile.9.png b/res/drawable-xhdpi/ic_tile_for_recents_and_contact_tile.9.png
new file mode 100644
index 0000000..ebfe897
--- /dev/null
+++ b/res/drawable-xhdpi/ic_tile_for_recents_and_contact_tile.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/dialer_recent_card_bg.9.png b/res/drawable-xxhdpi/dialer_recent_card_bg.9.png
deleted file mode 100644
index 87d95f0..0000000
--- a/res/drawable-xxhdpi/dialer_recent_card_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_contacts_tiles.9.png b/res/drawable-xxhdpi/ic_contacts_tiles.9.png
new file mode 100644
index 0000000..4e6872d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_contacts_tiles.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_tile_for_recents_and_contact_tile.9.png b/res/drawable-xxhdpi/ic_tile_for_recents_and_contact_tile.9.png
new file mode 100644
index 0000000..0a99cdb
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_tile_for_recents_and_contact_tile.9.png
Binary files differ
diff --git a/res/drawable/background_all_contacts.xml b/res/drawable/background_favorites_menu.xml
similarity index 86%
rename from res/drawable/background_all_contacts.xml
rename to res/drawable/background_favorites_menu.xml
index 0d3703f..60933fd 100644
--- a/res/drawable/background_all_contacts.xml
+++ b/res/drawable/background_favorites_menu.xml
@@ -18,12 +18,12 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="false">
         <shape android:shape="rectangle" >
-            <solid android:color="@color/all_contacts_button_color" />
+            <solid android:color="@color/favorites_menu_background_color" />
         </shape>
     </item>
     <item android:state_pressed="true">
         <shape android:shape="rectangle" >
-            <solid android:color="@color/all_contacts_button_pressed_color" />
+            <solid android:color="@color/favorites_menu_pressed_color" />
         </shape>
     </item>
 </selector>
\ No newline at end of file
diff --git a/res/drawable/shadow_fade_up.xml b/res/drawable/shadow_fade_up.xml
new file mode 100644
index 0000000..e2d9934
--- /dev/null
+++ b/res/drawable/shadow_fade_up.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle" >
+    <gradient
+        android:type="linear"
+        android:startColor="#66999999"
+        android:endColor="#00ffffff"
+        android:angle="90"/>
+</shape>
\ No newline at end of file
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index e39b413..e17dc27 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -147,12 +147,8 @@
             <!-- The secondary action button; either play voicemail or call details. -->
             <ImageButton
                 android:id="@+id/secondary_action_icon"
-                android:layout_width="match_parent"
+                android:layout_width="fill_parent"
                 android:layout_height="match_parent"
-                android:paddingStart="@dimen/call_log_inner_margin"
-                android:paddingTop="@dimen/call_log_inner_margin"
-                android:paddingBottom="@dimen/call_log_inner_margin"
-                android:paddingEnd="@dimen/call_log_inner_margin"
                 android:scaleType="center"
                 android:background="?android:attr/selectableItemBackground"
                 android:nextFocusLeft="@id/primary_action_view"
diff --git a/res/layout/dialpad.xml b/res/layout/dialpad.xml
index c3db420..c13f525 100644
--- a/res/layout/dialpad.xml
+++ b/res/layout/dialpad.xml
@@ -22,7 +22,6 @@
     android:layout_height="wrap_content"
     android:paddingLeft="5dp"
     android:paddingRight="5dp"
-    android:background="@android:color/transparent"
     android:stretchColumns="*"
     android:layoutDirection="ltr" >
 
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment.xml
index 239f727..dfe5c7c 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment.xml
@@ -25,7 +25,11 @@
         android:layout_height="0dp"
         android:layout_weight="1"
         android:background="#00000000" />
-
+    <!-- Dialpad shadow -->
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="3dp"
+        android:background="@drawable/shadow_fade_up" />
     <view class="com.android.dialer.dialpad.DialpadFragment$HoverIgnoringLinearLayout"
         android:id="@+id/top"
         android:animateLayoutChanges="true"
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 0f80564..f708919 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -141,12 +141,6 @@
                     android:layout_alignParentRight="true"
                     />
             </RelativeLayout>
-            <Space
-                android:id="@+id/contact_tile_frame_spacer"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:layout_alignParentBottom="true"
-                android:visibility="gone"/>
         </LinearLayout>
     </FrameLayout>
 
diff --git a/res/layout/phone_favorite_tile_view.xml b/res/layout/phone_favorite_tile_view.xml
index 8562b36..952bb2a 100644
--- a/res/layout/phone_favorite_tile_view.xml
+++ b/res/layout/phone_favorite_tile_view.xml
@@ -25,7 +25,8 @@
         android:id="@+id/contact_favorite_card"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:focusable="true">
+        android:focusable="true"
+        android:background="@drawable/ic_contacts_tiles">
 
         <com.android.contacts.common.widget.LayoutSuppressingImageView
             android:id="@+id/contact_tile_image"
@@ -42,11 +43,11 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingLeft="8dp"
-            android:paddingRight="@dimen/contact_tile_info_button_height_and_width"
-            android:paddingStart="8dp"
-            android:paddingEnd="@dimen/contact_tile_info_button_height_and_width"
-            android:paddingBottom="12dp"
+            android:paddingLeft="@dimen/contact_tile_text_side_padding"
+            android:paddingRight="@dimen/contact_tile_text_side_padding"
+            android:paddingStart="@dimen/contact_tile_text_side_padding"
+            android:paddingEnd="@dimen/contact_tile_text_side_padding"
+            android:paddingBottom="@dimen/contact_tile_text_bottom_padding"
             android:layout_alignParentBottom="true"
             android:orientation="vertical" >
             <TextView
@@ -71,7 +72,6 @@
                 android:fontFamily="sans-serif"
                 android:singleLine="true"
                 android:textSize="11sp"
-                android:paddingBottom="2dp"
                 android:fadingEdge="horizontal"
                 android:fadingEdgeLength="3dip"
                 android:ellipsize="marquee"
diff --git a/res/layout/phone_favorites_fragment.xml b/res/layout/phone_favorites_fragment.xml
index d1ff3d7..23987a8 100644
--- a/res/layout/phone_favorites_fragment.xml
+++ b/res/layout/phone_favorites_fragment.xml
@@ -58,4 +58,5 @@
         android:layout_alignParentBottom="true"
         layout="@layout/phone_no_favorites"
         android:visibility="gone"/>
+
 </RelativeLayout>
diff --git a/res/layout/phone_favorites_menu.xml b/res/layout/phone_favorites_menu.xml
index 387ea5b..5f7a5a6 100644
--- a/res/layout/phone_favorites_menu.xml
+++ b/res/layout/phone_favorites_menu.xml
@@ -25,7 +25,8 @@
                 android:paddingRight="@dimen/favorites_menu_padding_horizontal"
                 android:paddingTop="@dimen/favorites_menu_padding_top"
                 android:paddingBottom="@dimen/favorites_menu_padding_bottom"
-                android:background="@color/favorites_menu_background_color"
+                android:background="@drawable/background_favorites_menu"
+                android:addStatesFromChildren="true"
         >
     <TextView
             android:layout_width="wrap_content"
@@ -38,7 +39,7 @@
             android:layout_centerVertical="true"
             android:gravity="center"
         />
-    <Button
+    <TextView
             android:id="@+id/all_contacts_button"
             android:fontFamily="@string/favorites_menu_all_contacts_font_family"
             android:layout_width="wrap_content"
@@ -47,10 +48,11 @@
             android:paddingRight="@dimen/favorites_menu_padding_horizontal"
             android:text="@string/favorites_menu_all_contacts"
             android:textSize="@dimen/favorites_menu_all_contacts_text_size"
-            android:background="@drawable/background_all_contacts"
+            android:background="@color/all_contacts_button_color"
             android:textColor="@color/all_contacts_button_text_color"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
             android:gravity="center"
+            android:focusable="true"
         />
 </RelativeLayout>
\ No newline at end of file
diff --git a/res/layout/phone_no_favorites.xml b/res/layout/phone_no_favorites.xml
index b95afd1..1a0079f 100644
--- a/res/layout/phone_no_favorites.xml
+++ b/res/layout/phone_no_favorites.xml
@@ -18,6 +18,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:orientation="vertical"
     android:minHeight="?android:attr/listPreferredItemHeight">
 
     <include
@@ -32,18 +33,23 @@
     <LinearLayout
         android:id="@+id/nofavorite_frame"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="match_parent"
         android:orientation="vertical"
+        android:layout_gravity="center"
         android:gravity="center"
-        android:layout_centerInParent="true">
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:layout_alignParentTop="true"
+        android:layout_above="@id/show_all_contact_button_in_nofav">
+
         <ImageView
             android:id="@+id/nofavorite_image"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
             android:gravity="center_horizontal"
             android:src="@drawable/no_favorites_banner"
-            android:layout_marginBottom="14dp"
-            android:contentDescription="@string/no_favorites"/>
+            android:layout_marginBottom="14dp"/>
+
         <TextView
             android:id="@+id/title"
             android:layout_width="match_parent"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index e9730ea..8712b25 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -57,12 +57,10 @@
     <!-- Background color of dialer list items (contacts, call log entries) -->
     <color name="background_dialer_list_items">#eeeeee</color>
 
-    <!-- Background color of action bars.  Ensure this stays in sync with packages/Telephony
-         actionbar_background_color. -->
+    <!-- Background color of action bars -->
     <color name="actionbar_background_color">#3B77E7</color>
 
-    <!-- Underline color of action bars.  Ensure this stays in sync with packages/Telephony
-         actionbar_underline. -->
+    <!-- Underline color of action bars -->
     <color name="actionbar_underline">#3265C1</color>
 
     <!-- Color of the 1dp divider that separates favorites -->
@@ -96,11 +94,11 @@
     <!-- Background color for the "All Contacts" button in the favorites menu. -->
     <color name="all_contacts_button_color">#999999</color>
 
-    <!-- Background color for the "All Contacts" button in the favorites menu when pressed. -->
-    <color name="all_contacts_button_pressed_color">#808080</color>
+    <!-- Background color for the favorites menu when pressed. -->
+    <color name="favorites_menu_pressed_color">#d6d6d6</color>
 
     <!-- Background color for the favorites menu. -->
-    <color name="favorites_menu_background_color">#eeeeee</color>
+    <color name="favorites_menu_background_color">#ebebeb</color>
 
     <!-- Text color for the "All Contacts" button above the favorite callers -->
     <color name="all_contacts_button_text_color">#ffffff</color>
@@ -132,7 +130,6 @@
     <!-- Color of the bottom border below the contacts grid on the main dialer screen. -->
     <color name="contacts_grid_bottom_border_color">#16000000</color>
 
-    <!-- Color of action bar text. Ensure this stays in sync with packages/Telephony
-         phone_settings_actionbar_text_color-->
+    <!-- Color of action bar text. -->
     <color name="actionbar_text_color">#FFFFFF</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 6e563c1..9490d8d 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -27,7 +27,7 @@
 
     <!-- Call Log -->
     <dimen name="call_log_call_action_size">32dip</dimen>
-    <dimen name="call_log_call_action_width">48dip</dimen>
+    <dimen name="call_log_call_action_width">54dp</dimen>
     <dimen name="call_log_icon_margin">4dip</dimen>
     <dimen name="call_log_inner_margin">8dip</dimen>
     <dimen name="call_log_outer_margin">8dip</dimen>
@@ -38,7 +38,7 @@
     <dimen name="call_detail_button_spacing">2dip</dimen>
     <!-- Defines the vertical margin for the vertical separator between
          the main area of a call log entry and the secondary action button. -->
-    <dimen name="call_log_list_item_vertical_divider_margin">8dp</dimen>
+    <dimen name="call_log_list_item_vertical_divider_margin">17dp</dimen>
 
     <!-- Defines the width of the vertical separator between
          the main area of a call log entry and the secondary action button. -->
@@ -73,6 +73,8 @@
     <dimen name="contact_tile_divider_padding">3dp</dimen>
     <dimen name="contact_tile_info_button_height_and_width">36dp</dimen>
     <item name="contact_tile_height_to_width_ratio" type="dimen">67%</item>
+    <dimen name="contact_tile_text_side_padding">10dp</dimen>
+    <dimen name="contact_tile_text_bottom_padding">8dp</dimen>
     <dimen name="favorites_row_top_padding">6dp</dimen>
     <dimen name="favorites_row_bottom_padding">6dp</dimen>
     <dimen name="favorites_row_start_padding">8dp</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 1025d0f..3921a5d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -86,7 +86,12 @@
     <!-- A "hidden" action bar style.  Used when loading the launcher activity so that the
          default actionbar is effectively hidden. -->
     <style name="DialtactsHiddenActionBarStyle" parent="DialtactsActionBarStyle">
-        <item name="android:height">0dp</item>
+        <item name="android:background">@color/background_dialer_light</item>
+        <item name="android:titleTextStyle">@style/DialtactsHiddenActionBarTextStyle</item>
+    </style>
+
+    <style name="DialtactsHiddenActionBarTextStyle" parent="@android:style/TextAppearance">
+        <item name="android:textColor">@color/background_dialer_light</item>
     </style>
 
     <!-- Action bar overflow menu icon. -->
@@ -107,9 +112,6 @@
         <item name="android:windowBackground">@color/background_dialer_list_items</item>
         <item name="android:gravity">top</item>
         <item name="android:listViewStyle">@style/ListViewStyle</item>
-        <item name="android:actionBarStyle">@style/DialtactsActionBarStyle</item>
-        <item name="android:actionOverflowButtonStyle">@style/DialtactsActionBarOverflow</item>
-        <item name="android:homeAsUpIndicator">@drawable/ic_back_arrow</item>
         <!-- CallLog -->
         <item name="call_log_primary_text_color">#333333</item>
         <item name="call_log_primary_background_color">#FFFFFF</item>
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index eee3838..1e99b23 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -122,7 +122,7 @@
 
     private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1;
 
-    private static final int FADE_ANIMATION_DURATION = 200;
+    private static final int ANIMATION_DURATION = 200;
 
     private String mFilterText;
 
@@ -152,10 +152,9 @@
     private View mDialpadButton;
     private View mDialButton;
     private PopupMenu mOverflowMenu;
+    private PopupMenu mDialpadOverflowMenu;
 
-    // Padding view used to shift the fragment frame up when the dialpad is shown so that
-    // the contents of the fragment frame continue to exist in a layout of the same height
-    private View mFragmentsSpacer;
+    // Padding view used to shift the fragments up when the dialpad is shown.
     private View mFragmentsFrame;
 
     private boolean mInDialpadSearch;
@@ -316,26 +315,12 @@
         }
 
         mFragmentsFrame = findViewById(R.id.dialtacts_frame);
-        mFragmentsSpacer = findViewById(R.id.contact_tile_frame_spacer);
 
         mRemoveViewContainer = (RemoveView) findViewById(R.id.remove_view_container);
+
         mSearchAndRemoveViewContainer = findViewById(R.id.search_and_remove_view_container);
 
-        // When the first global layout pass is completed (and mSearchAndRemoveViewContainer has
-        // been assigned a valid height), assign that height to mFragmentsSpacer as well.
-        mSearchAndRemoveViewContainer.getViewTreeObserver().addOnGlobalLayoutListener(
-                new OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        mSearchAndRemoveViewContainer.getViewTreeObserver()
-                                .removeOnGlobalLayoutListener(this);
-                        mFragmentsSpacer.setLayoutParams(
-                                new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                                        mSearchAndRemoveViewContainer.getHeight()));
-                    }
-                });
-
-
+        setupFakeActionBarItems();
         prepareSearchView();
 
         if (UI.FILTER_CONTACTS_ACTION.equals(intent.getAction())
@@ -344,7 +329,6 @@
         }
 
         hideDialpadFragment(false, false);
-        setupFakeActionBarItems();
 
         mDialerDatabaseHelper = DatabaseHelperManager.getDatabaseHelper(this);
         SmartDialPrefix.initializeNanpSettings(this);
@@ -393,10 +377,16 @@
             mSmartDialSearchFragment = (SmartDialSearchFragment) fragment;
             mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener(
                     mPhoneNumberPickerActionListener);
+            if (mFragmentsFrame != null) {
+                mFragmentsFrame.setAlpha(1.0f);
+            }
         } else if (fragment instanceof SearchFragment) {
             mRegularSearchFragment = (RegularSearchFragment) fragment;
             mRegularSearchFragment.setOnPhoneNumberPickerActionListener(
                     mPhoneNumberPickerActionListener);
+            if (mFragmentsFrame != null) {
+                mFragmentsFrame.setAlpha(1.0f);
+            }
         } else if (fragment instanceof PhoneFavoriteFragment) {
             mPhoneFavoriteFragment = (PhoneFavoriteFragment) fragment;
             mPhoneFavoriteFragment.setListener(mPhoneFavoriteListener);
@@ -451,7 +441,7 @@
         switch (view.getId()) {
             case R.id.overflow_menu: {
                 if (isDialpadShowing()) {
-                    mDialpadFragment.optionsMenuInvoked(view);
+                    mDialpadOverflowMenu.show();
                 } else {
                     mOverflowMenu.show();
                 }
@@ -545,6 +535,12 @@
         ft.commit();
         mDialButton.setVisibility(shouldShowOnscreenDialButton() ? View.VISIBLE : View.GONE);
         mDialpadButton.setVisibility(View.GONE);
+
+        if (mDialpadOverflowMenu == null) {
+            mDialpadOverflowMenu = mDialpadFragment.buildOptionsMenu(mMenuButton);
+        }
+
+        mMenuButton.setOnTouchListener(mDialpadOverflowMenu.getDragToOpenListener());
     }
 
     public void hideDialpadFragment(boolean animate, boolean clearDialpad) {
@@ -562,6 +558,7 @@
         ft.commit();
         mDialButton.setVisibility(View.GONE);
         mDialpadButton.setVisibility(View.VISIBLE);
+        mMenuButton.setOnTouchListener(mOverflowMenu.getDragToOpenListener());
     }
 
     private void prepareSearchView() {
@@ -610,26 +607,26 @@
 
     public void hideSearchBar() {
         final int height = mSearchAndRemoveViewContainer.getHeight();
-
         mSearchAndRemoveViewContainer.animate().cancel();
         mSearchAndRemoveViewContainer.setAlpha(1);
         mSearchAndRemoveViewContainer.setTranslationY(0);
         mSearchAndRemoveViewContainer.animate().withLayer().alpha(0)
-                .translationY(-height).setDuration(200)
+                .translationY(-height).setDuration(ANIMATION_DURATION)
                 .setListener(mHideListener);
 
         mFragmentsFrame.animate().withLayer()
-                .translationY(-height).setDuration(200).setListener(
+                .translationY(-height).setDuration(ANIMATION_DURATION).setListener(
                 new AnimatorListenerAdapter() {
                     @Override
                     public void onAnimationEnd(Animator animation) {
                         mFragmentsFrame.setTranslationY(0);
-                        // Display the fragments spacer (which has the same height as the
-                        // search box) now that the search box is hidden, so that
-                        // mFragmentsFrame always retains the same height
-                        mFragmentsSpacer.setVisibility(View.VISIBLE);
                     }
                 });
+
+        if (!mInDialpadSearch && !mInRegularSearch) {
+            // If the favorites fragment is showing, fade to blank.
+            mFragmentsFrame.animate().alpha(0.0f);
+        }
     }
 
     public void showSearchBar() {
@@ -638,7 +635,7 @@
         mSearchAndRemoveViewContainer.setAlpha(0);
         mSearchAndRemoveViewContainer.setTranslationY(-height);
         mSearchAndRemoveViewContainer.animate().withLayer().alpha(1).translationY(0)
-                .setDuration(200).setListener(new AnimatorListenerAdapter() {
+                .setDuration(ANIMATION_DURATION).setListener(new AnimatorListenerAdapter() {
                         @Override
                         public void onAnimationStart(Animator animation) {
                             mSearchAndRemoveViewContainer.setVisibility(View.VISIBLE);
@@ -646,35 +643,29 @@
                     });
 
         mFragmentsFrame.setTranslationY(-height);
-        mFragmentsFrame.animate().withLayer().translationY(0).setDuration(200)
+        mFragmentsFrame.animate().withLayer().translationY(0).setDuration(ANIMATION_DURATION)
+                .alpha(1.0f)
                 .setListener(
                         new AnimatorListenerAdapter() {
                             @Override
                             public void onAnimationStart(Animator animation) {
-                                // Hide the fragment spacer now that the search box will
-                                // be displayed again
-                                mFragmentsSpacer.setVisibility(View.GONE);
                             }
                         });
     }
 
-
-    public void setupFakeActionBarItems() {
+    private void setupFakeActionBarItems() {
         mMenuButton = findViewById(R.id.overflow_menu);
         if (mMenuButton != null) {
             mMenuButton.setOnClickListener(this);
-
-            mOverflowMenu = new OverflowPopupMenu(DialtactsActivity.this, mMenuButton);
-            final Menu menu = mOverflowMenu.getMenu();
-            mOverflowMenu.inflate(R.menu.dialtacts_options);
-            mOverflowMenu.setOnMenuItemClickListener(this);
+            if (mOverflowMenu == null) {
+                mOverflowMenu = buildOptionsMenu(mMenuButton);
+            }
             mMenuButton.setOnTouchListener(mOverflowMenu.getDragToOpenListener());
         }
 
         mFakeActionBar = findViewById(R.id.fake_action_bar);
 
         mCallHistoryButton = findViewById(R.id.call_history_button);
-        // mCallHistoryButton.setMinimumWidth(fakeMenuItemWidth);
         mCallHistoryButton.setOnClickListener(this);
 
         mDialButton = findViewById(R.id.dial_button);
@@ -682,10 +673,16 @@
         mDialButton.setOnLongClickListener(this);
 
         mDialpadButton = findViewById(R.id.dialpad_button);
-        // DialpadButton.setMinimumWidth(fakeMenuItemWidth);
         mDialpadButton.setOnClickListener(this);
     }
 
+    private PopupMenu buildOptionsMenu(View invoker) {
+        PopupMenu menu = new OverflowPopupMenu(this, invoker);
+        menu.inflate(R.menu.dialtacts_options);
+        menu.setOnMenuItemClickListener(this);
+        return menu;
+    }
+
     private void fixIntent(Intent intent) {
         // This should be cleaned up: the call key used to send an Intent
         // that just said to go to the recent calls list.  It now sends this
@@ -884,7 +881,6 @@
         }
 
         final FragmentTransaction transaction = getFragmentManager().beginTransaction();
-        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 
         SearchFragment fragment;
         if (mInDialpadSearch) {
@@ -930,6 +926,10 @@
         // transitioned between search fragments
         getFragmentManager().popBackStack(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);
         setNotInSearchUi();
+
+        if (isDialpadShowing()) {
+            mFragmentsFrame.setAlpha(0);
+        }
     }
 
     /** Returns an Intent to launch Call Settings screen */
@@ -982,7 +982,9 @@
 
     @Override
     public void setDialButtonEnabled(boolean enabled) {
-        mDialButton.setEnabled(enabled);
+        if (mDialButton != null) {
+            mDialButton.setEnabled(enabled);
+        }
     }
 
     @Override
@@ -1018,7 +1020,7 @@
 
     @Override
     public void onDragStarted(int itemIndex, int x, int y, PhoneFavoriteTileView view) {
-        crossfadeViews(mRemoveViewContainer, mSearchViewContainer, FADE_ANIMATION_DURATION);
+        crossfadeViews(mRemoveViewContainer, mSearchViewContainer, ANIMATION_DURATION);
     }
 
     @Override
@@ -1026,7 +1028,7 @@
 
     @Override
     public void onDragFinished(int x, int y) {
-        crossfadeViews(mSearchViewContainer, mRemoveViewContainer, FADE_ANIMATION_DURATION);
+        crossfadeViews(mSearchViewContainer, mRemoveViewContainer, ANIMATION_DURATION);
     }
 
     @Override
@@ -1056,7 +1058,7 @@
 
         fadeIn.setVisibility(View.VISIBLE);
         fadeIn.setAlpha(0);
-        fadeIn.animate().alpha(1).setDuration(FADE_ANIMATION_DURATION)
+        fadeIn.animate().alpha(1).setDuration(ANIMATION_DURATION)
                 .setListener(null);
     }
 
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index aee24ba..175a733 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -642,8 +642,11 @@
             contactType = ContactPhotoManager.TYPE_BUSINESS;
         }
 
-        String lookupKey = lookupUri == null ? null
-                : ContactInfoHelper.getLookupKeyFromUri(lookupUri);
+        String lookupKey = info.lookupKey;
+        if (lookupUri != null) {
+            //lookupKey = ContactInfoHelper.getLookupKeyFromUri(lookupUri);
+
+        }
 
         String nameForDefaultImage = null;
         if (TextUtils.isEmpty(name)) {
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index a184423..83cfbd8 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -931,18 +931,17 @@
     }
 
     /**
-     * Called by the containing Activity to tell this Fragment that the gesture to display the
-     * "options" menu has been invoked.
+     * Called by the containing Activity to tell this Fragment to build an overflow options
+     * menu for display by the container when appropriate.
      *
      * @param invoker the View that invoked the options menu, to act as an anchor location.
      */
-    public void optionsMenuInvoked(View invoker) {
+    public PopupMenu buildOptionsMenu(View invoker) {
         final PopupMenu popupMenu = new PopupMenu(getActivity(), invoker);
-        final Menu menu = popupMenu.getMenu();
         popupMenu.inflate(R.menu.dialpad_options);
         popupMenu.setOnMenuItemClickListener(this);
-        setupMenuItems(menu);
-        popupMenu.show();
+        setupMenuItems(popupMenu.getMenu());
+        return popupMenu;
     }
 
     /**
@@ -1564,6 +1563,9 @@
      * Update the enabledness of the "Dial" and "Backspace" buttons if applicable.
      */
     private void updateDialAndDeleteButtonEnabledState() {
+        if (getActivity() == null) {
+            return;
+        }
         final boolean digitsNotEmpty = !isDigitsEmpty();
         mDelete.setEnabled(digitsNotEmpty);
         // On CDMA phones, if we're already on a call, we *always* enable the Dial button (since
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index 354765f..484a3d9 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -444,11 +444,11 @@
             final int position = firstVisiblePosition + i;
             final long itemId = mAdapter.getItemId(position);
             final int itemViewType = mAdapter.getItemViewType(position);
-            if (itemViewType == PhoneFavoritesTileAdapter.ViewTypes.TOP) {
+            if (itemViewType == PhoneFavoritesTileAdapter.ViewTypes.TOP &&
+                    child instanceof ContactTileRow) {
                 // This is a tiled row, so save horizontal offsets instead
                 saveHorizontalOffsets((ContactTileRow) child, (ArrayList<ContactEntry>)
-                        mAdapter.getItem(position),
-                        mAdapter.getAdjustedPositionInContactTileAdapter(position));
+                        mAdapter.getItem(position), position);
             }
             if (DEBUG) {
                 Log.d(TAG, "Saving itemId: " + itemId + " for listview child " + i + " Top: "
@@ -507,6 +507,7 @@
                 int left = child.getLeft();
 
                 Integer startRow = mItemIdTopMap.get(itemId);
+
                 if (startRow != null) {
                     if (startRow > currentRow) {
                         // Item has shifted upwards to the previous row.
@@ -535,6 +536,10 @@
                         animators.add(ObjectAnimator.ofFloat(
                                 child, "translationX", delta, 0.0f));
                     }
+                } else {
+                    // In case the last square row is pushed up from the non-square section.
+                    animators.add(ObjectAnimator.ofFloat(
+                            child, "translationX", left, 0.0f));
                 }
             }
         }
@@ -576,7 +581,7 @@
                         // This is a tiled row, so perform horizontal animations instead
                         performHorizontalAnimations((ContactTileRow) child, (
                                 ArrayList<ContactEntry>) mAdapter.getItem(position), idsInPlace,
-                                mAdapter.getAdjustedPositionInContactTileAdapter(position));
+                                position);
                     }
 
                     final long itemId = mAdapter.getItemId(position);
@@ -606,6 +611,11 @@
                             }
                             startTop = top + (i > 0 ? itemHeight : -itemHeight);
                             delta = startTop - top;
+                        } else {
+                            // In case the first non-square row is pushed down
+                            // from the square section.
+                            animators.add(ObjectAnimator.ofFloat(
+                                    child, "alpha", 0.0f, 1.0f));
                         }
                         if (DEBUG) {
                             Log.d(TAG, "Found itemId: " + itemId + " for listview child " + i +
@@ -664,12 +674,12 @@
 
     /**
      * Prepares the favorites menu which contains the static label "Speed Dial" and the
-     * "All Contacts" button.  Sets the onClickListener for the "All Contacts" button.
+     * "All Contacts" button.  Taps anywhere in the view take the user to "All Contacts".
+     * This emulates how the headers in Play Store work.
      */
     private void prepareFavoritesMenu(View favoritesMenu) {
-        Button allContactsButton = (Button) favoritesMenu.findViewById(R.id.all_contacts_button);
-        // Set the onClick listener for the button to bring up the all contacts view.
-        allContactsButton.setOnClickListener(new OnClickListener() {
+        // Set the onClick listener for the view to bring up the all contacts view.
+        favoritesMenu.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
                 showAllContacts();
diff --git a/src/com/android/dialer/list/PhoneFavoriteListView.java b/src/com/android/dialer/list/PhoneFavoriteListView.java
index adda3cf..078cf3e 100644
--- a/src/com/android/dialer/list/PhoneFavoriteListView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteListView.java
@@ -62,7 +62,7 @@
 
     private Handler mScrollHandler;
     private final long SCROLL_HANDLER_DELAY_MILLIS = 5;
-    private final int DRAG_SCROLL_PX_UNIT = 10;
+    private final int DRAG_SCROLL_PX_UNIT = 25;
 
     private boolean mIsDragScrollerRunning = false;
     private int mTouchDownForDragStartX;
diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
index 5463670..d2288e4 100644
--- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
@@ -144,7 +144,7 @@
             }
         }
         // Set position to the position of the actual favorite contact in the favorites adapter
-        position = getAdjustedPositionInContactTileAdapter(position);
+        position = getAdjustedFavoritePosition(position, callLogAdapterCount);
 
         return mContactTileAdapter.getItem(position);
     }
@@ -176,7 +176,7 @@
         } else if (position < (callLogAdapterCount + mContactTileAdapter.getCount() +
                 getTeaserViewCount() + 1)) {
             return mContactTileAdapter.getItemId(
-                    getAdjustedPositionInContactTileAdapter(position));
+                    getAdjustedFavoritePosition(position, callLogAdapterCount));
         } else {
             // Default fallback.  We don't normally get here.
             return FAVORITES_MENU_ITEM_ID;
@@ -216,7 +216,7 @@
             return mContactTileAdapter.getViewTypeCount() + 3;
         } else if (position < getCount()) {
             return mContactTileAdapter.getItemViewType(
-                    getAdjustedPositionInContactTileAdapter(position));
+                    getAdjustedFavoritePosition(position, callLogAdapterCount));
         } else {
             // Catch-all - we shouldn't get here but if we do use the same as the favorites menu.
             return mContactTileAdapter.getViewTypeCount() + 3;
@@ -269,7 +269,7 @@
 
         // Set position to the position of the actual favorite contact in the favorites adapter.
         // Adjusts based on the presence of other views, such as the favorites menu.
-        position = getAdjustedPositionInContactTileAdapter(position);
+        position = getAdjustedFavoritePosition(position, callLogAdapterCount);
 
         // Favorites section
         final View view = mContactTileAdapter.getView(position, convertView, parent);
@@ -296,19 +296,18 @@
             return mCallLogAdapter.isEnabled(position);
         } else { // For favorites section
             return mContactTileAdapter.isEnabled(
-                    getAdjustedPositionInContactTileAdapter(position));
+                    getAdjustedFavoritePosition(position, callLogAdapterCount));
         }
     }
 
     /**
-     * Given the current position in the merged adapter, return the index in the
-     * mContactTileAdapter this position corresponds to.
+     * Determines the index into the mContactTileAdapter for the current position.
      *
-     * @param position current position in the overall (merged) adapter.
+     * @param position current position in the overall adapter.
+     * @param callLogAdapterCount number of entries in "last calls" list (ie 0 or 1).
      * @return position in the mContactTileAdapter.
      */
-    public int getAdjustedPositionInContactTileAdapter(int position) {
-        final int callLogAdapterCount = mCallLogAdapter.getCount();
+    private int getAdjustedFavoritePosition(int position, int callLogAdapterCount) {
         if (position - callLogAdapterCount > TILE_INTERACTION_TEASER_VIEW_POSITION &&
                 mTileInteractionTeaserView.getShouldDisplayInList()) {
             return position - callLogAdapterCount - 2;
@@ -345,7 +344,7 @@
 
         @Override
         public void addView(View view) {
-            view.setBackgroundResource(R.drawable.dialer_recent_card_bg);
+            view.setBackgroundResource(R.drawable.ic_tile_for_recents_and_contact_tile);
 
             final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                     FrameLayout.LayoutParams.MATCH_PARENT,
diff --git a/src/com/android/dialer/list/PhoneFavoriteTileView.java b/src/com/android/dialer/list/PhoneFavoriteTileView.java
index 471601d..f55d4fc 100644
--- a/src/com/android/dialer/list/PhoneFavoriteTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteTileView.java
@@ -49,12 +49,12 @@
     private static final boolean DEBUG = false;
 
     // These parameters instruct the photo manager to display the default image/letter at 70% of
-    // its normal size, and vertically offset upwards 20% towards the top of the letter tile, to
+    // its normal size, and vertically offset upwards 14% towards the top of the letter tile, to
     // make room for the contact name and number label at the bottom of the image.
-    private static final float DEFAULT_IMAGE_LETTER_OFFSET = -0.2f;
+    private static final float DEFAULT_IMAGE_LETTER_OFFSET = -0.14f;
     private static final float DEFAULT_IMAGE_LETTER_SCALE = 0.70f;
 
-    /** Length of all animations in miniseconds. */
+    /** Length of all animations in milliseconds. */
     private int mAnimationDuration;
 
     /** The view that holds the front layer of the favorite contact card. */
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackFragment.java b/src/com/android/dialer/voicemail/VoicemailPlaybackFragment.java
index 826dec0..1dbae65 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackFragment.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackFragment.java
@@ -74,9 +74,7 @@
     };
 
     private VoicemailPlaybackPresenter mPresenter;
-    private static int mMediaPlayerRefCount = 0;
-    private static MediaPlayerProxy mMediaPlayerInstance;
-    private static ScheduledExecutorService mScheduledExecutorService;
+    private ScheduledExecutorService mScheduledExecutorService;
     private View mPlaybackLayout;
 
     @Override
@@ -89,6 +87,7 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        mScheduledExecutorService = createScheduledExecutorService();
         Bundle arguments = getArguments();
         Preconditions.checkNotNull(arguments, "fragment must be started with arguments");
         Uri voicemailUri = arguments.getParcelable(EXTRA_VOICEMAIL_URI);
@@ -100,8 +99,8 @@
                 powerManager.newWakeLock(
                         PowerManager.SCREEN_DIM_WAKE_LOCK, getClass().getSimpleName());
         mPresenter = new VoicemailPlaybackPresenter(createPlaybackViewImpl(),
-                getMediaPlayerInstance(), voicemailUri,
-                getScheduledExecutorServiceInstance(), startPlayback,
+                createMediaPlayer(mScheduledExecutorService), voicemailUri,
+                mScheduledExecutorService, startPlayback,
                 AsyncTaskExecutors.createAsyncTaskExecutor(), wakeLock);
         mPresenter.onCreate(savedInstanceState);
     }
@@ -114,8 +113,8 @@
 
     @Override
     public void onDestroy() {
-        shutdownMediaPlayer();
         mPresenter.onDestroy();
+        mScheduledExecutorService.shutdown();
         super.onDestroy();
     }
 
@@ -130,36 +129,12 @@
                 mPlaybackLayout);
     }
 
-    private static synchronized MediaPlayerProxy getMediaPlayerInstance() {
-        ++mMediaPlayerRefCount;
-        if (mMediaPlayerInstance == null) {
-            mMediaPlayerInstance = VariableSpeed.createVariableSpeed(
-                    getScheduledExecutorServiceInstance());
-        }
-        return mMediaPlayerInstance;
+    private MediaPlayerProxy createMediaPlayer(ExecutorService executorService) {
+        return VariableSpeed.createVariableSpeed(executorService);
     }
 
-    private static synchronized ScheduledExecutorService getScheduledExecutorServiceInstance() {
-        if (mScheduledExecutorService == null) {
-            mScheduledExecutorService = Executors.newScheduledThreadPool(
-                    NUMBER_OF_THREADS_IN_POOL);
-        }
-        return mScheduledExecutorService;
-    }
-
-    private static synchronized void shutdownMediaPlayer() {
-        --mMediaPlayerRefCount;
-        if (mMediaPlayerRefCount > 0) {
-            return;
-        }
-        if (mScheduledExecutorService != null) {
-            mScheduledExecutorService.shutdown();
-            mScheduledExecutorService = null;
-        }
-        if (mMediaPlayerInstance != null) {
-            mMediaPlayerInstance.release();
-            mMediaPlayerInstance = null;
-        }
+    private ScheduledExecutorService createScheduledExecutorService() {
+        return Executors.newScheduledThreadPool(NUMBER_OF_THREADS_IN_POOL);
     }
 
     /**
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index 085ef66..ebda0eb 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -35,7 +35,6 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
-import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -312,7 +311,6 @@
                             mPlayer.setDataSource(mView.getDataSourceContext(), mVoicemailUri);
                             mPlayer.setAudioStreamType(PLAYBACK_STREAM);
                             mPlayer.prepare();
-                            mDuration.set(mPlayer.getDuration());
                             return null;
                         } catch (Exception e) {
                             return e;
@@ -346,7 +344,7 @@
         mView.setSpeakerPhoneOn(mView.isSpeakerPhoneOn());
         mView.setRateDecreaseButtonListener(createRateDecreaseListener());
         mView.setRateIncreaseButtonListener(createRateIncreaseListener());
-        mView.setClipPosition(0, mDuration.get());
+        mView.setClipPosition(0, mPlayer.getDuration());
         mView.playbackStopped();
         // Always disable on stop.
         mView.disableProximitySensor();
@@ -365,10 +363,6 @@
     }
 
     public void onDestroy() {
-        if (mPrepareTask != null) {
-            mPrepareTask.cancel(false);
-            mPrepareTask = null;
-        }
         mPlayer.release();
         if (mFetchResultHandler != null) {
             mFetchResultHandler.destroy();
@@ -436,67 +430,49 @@
         }
     }
 
-    private class AsyncPrepareTask extends AsyncTask<Void, Void, Exception> {
-        private int mClipPositionInMillis;
-
-        AsyncPrepareTask(int clipPositionInMillis) {
-            mClipPositionInMillis = clipPositionInMillis;
-        }
-
-        @Override
-        public Exception doInBackground(Void... params) {
-            try {
-                if (!mPlayer.isReadyToPlay()) {
-                    mPlayer.reset();
-                    mPlayer.setDataSource(mView.getDataSourceContext(), mVoicemailUri);
-                    mPlayer.setAudioStreamType(PLAYBACK_STREAM);
-                    mPlayer.prepare();
-                }
-                return null;
-            } catch (Exception e) {
-                return e;
-            }
-        }
-
-        @Override
-        public void onPostExecute(Exception exception) {
-            mPrepareTask = null;
-            if (exception == null) {
-                final int duration = mPlayer.getDuration();
-                mDuration.set(duration);
-                int startPosition =
-                    constrain(mClipPositionInMillis, 0, duration);
-                mPlayer.seekTo(startPosition);
-                mView.setClipPosition(startPosition, duration);
-                try {
-                    // Can throw RejectedExecutionException
-                    mPlayer.start();
-                    mView.playbackStarted();
-                    if (!mWakeLock.isHeld()) {
-                        mWakeLock.acquire();
-                    }
-                    // Only enable if we are not currently using the speaker phone.
-                    if (!mView.isSpeakerPhoneOn()) {
-                        mView.enableProximitySensor();
-                    }
-                    // Can throw RejectedExecutionException
-                    mPositionUpdater.startUpdating(startPosition, duration);
-                } catch (RejectedExecutionException e) {
-                    handleError(e);
-                }
-            } else {
-                handleError(exception);
-            }
-        }
-    }
-
     private void resetPrepareStartPlaying(final int clipPositionInMillis) {
         if (mPrepareTask != null) {
             mPrepareTask.cancel(false);
-            mPrepareTask = null;
         }
         mPrepareTask = mAsyncTaskExecutor.submit(Tasks.RESET_PREPARE_START_MEDIA_PLAYER,
-                new AsyncPrepareTask(clipPositionInMillis));
+                new AsyncTask<Void, Void, Exception>() {
+                    @Override
+                    public Exception doInBackground(Void... params) {
+                        try {
+                            mPlayer.reset();
+                            mPlayer.setDataSource(mView.getDataSourceContext(), mVoicemailUri);
+                            mPlayer.setAudioStreamType(PLAYBACK_STREAM);
+                            mPlayer.prepare();
+                            return null;
+                        } catch (Exception e) {
+                            return e;
+                        }
+                    }
+
+                    @Override
+                    public void onPostExecute(Exception exception) {
+                        mPrepareTask = null;
+                        if (exception == null) {
+                            mDuration.set(mPlayer.getDuration());
+                            int startPosition =
+                                    constrain(clipPositionInMillis, 0, mDuration.get());
+                            mView.setClipPosition(startPosition, mDuration.get());
+                            mPlayer.seekTo(startPosition);
+                            mPlayer.start();
+                            mView.playbackStarted();
+                            if (!mWakeLock.isHeld()) {
+                                mWakeLock.acquire();
+                            }
+                            // Only enable if we are not currently using the speaker phone.
+                            if (!mView.isSpeakerPhoneOn()) {
+                                mView.enableProximitySensor();
+                            }
+                            mPositionUpdater.startUpdating(startPosition, mDuration.get());
+                        } else {
+                            handleError(exception);
+                        }
+                    }
+                });
     }
 
     private void handleError(Exception e) {
@@ -622,7 +598,6 @@
             synchronized (mLock) {
                 if (mScheduledFuture != null) {
                     mScheduledFuture.cancel(false);
-                    mScheduledFuture = null;
                 }
                 mScheduledFuture = mExecutorService.scheduleAtFixedRate(this, 0, mPeriodMillis,
                         TimeUnit.MILLISECONDS);
@@ -645,7 +620,6 @@
         }
         if (mPrepareTask != null) {
             mPrepareTask.cancel(false);
-            mPrepareTask = null;
         }
         if (mWakeLock.isHeld()) {
             mWakeLock.release();