merge in ics-mr1-release history after reset to ics-mr1
diff --git a/res/layout/call_log_fragment.xml b/res/layout/call_log_fragment.xml
index f87e981..d652ad7 100644
--- a/res/layout/call_log_fragment.xml
+++ b/res/layout/call_log_fragment.xml
@@ -19,7 +19,9 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingBottom="?android:attr/actionBarSize">
+    android:paddingBottom="?android:attr/actionBarSize"
+    android:divider="?android:attr/dividerHorizontal"
+    android:showDividers="end">
 
     <FrameLayout
         android:id="@+id/voicemail_status"
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment.xml
index 2785af0..df13372 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment.xml
@@ -38,7 +38,6 @@
             android:layout_width="0dip"
             android:layout_weight="1"
             android:layout_height="match_parent"
-            android:layout_alignParentLeft="true"
             android:gravity="center"
             android:textAppearance="@style/DialtactsDigitsTextAppearance"
             android:textColor="?android:attr/textColorPrimary"
@@ -46,15 +45,15 @@
             android:background="@android:color/transparent" />
 
         <ImageButton
-            android:id="@+id/overflow_menu"
-            android:layout_width="48dip"
+            android:id="@+id/deleteButton"
+            android:layout_width="56dip"
             android:layout_height="match_parent"
-            android:layout_alignParentRight="true"
-            android:src="@drawable/ic_menu_overflow"
-            android:contentDescription="@*android:string/action_menu_overflow_description"
-            android:nextFocusLeft="@id/digits"
-            android:background="?android:attr/selectableItemBackground"/>
-
+            android:layout_gravity="center_vertical"
+            android:gravity="center"
+            android:state_enabled="false"
+            android:background="?android:attr/selectableItemBackground"
+            android:contentDescription="@string/description_delete_button"
+            android:src="@drawable/ic_dial_action_delete" />
     </LinearLayout>
 
     <!-- Keypad section -->
@@ -65,8 +64,44 @@
        android:layout_height="@dimen/dialpad_vertical_margin"
        android:background="#66000000"/>
 
-    <!-- Horizontal row of buttons (Search + DialButton + Delete.) -->
-    <include layout="@layout/dialpad_additional_buttons" />
+    <LinearLayout
+        android:id="@+id/dialButtonContainer"
+        android:layout_width="match_parent"
+        android:layout_height="0px"
+        android:layout_weight="@integer/dialpad_layout_weight_additional_buttons"
+        android:layout_gravity="center_horizontal"
+        android:background="@drawable/dialpad_background">
+        <ImageButton
+            android:id="@+id/searchButton"
+            android:layout_width="wrap_content"
+            android:layout_height="?android:attr/actionBarSize"
+            android:layout_gravity="bottom|center_horizontal"
+            android:state_enabled="false"
+            android:background="?android:attr/selectableItemBackground"
+            android:contentDescription="@string/description_search_button"
+            android:src="@drawable/ic_dial_action_search"/>
+
+        <ImageButton
+            android:id="@+id/dialButton"
+            android:layout_width="0px"
+            android:layout_weight="1"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:state_enabled="false"
+            android:background="@drawable/btn_call"
+            android:contentDescription="@string/description_dial_button"
+            android:src="@drawable/ic_dial_action_call" />
+
+        <ImageButton
+            android:id="@+id/overflow_menu"
+            android:layout_width="wrap_content"
+            android:layout_height="?android:attr/actionBarSize"
+            android:layout_gravity="bottom|center_horizontal"
+            android:src="@drawable/ic_menu_overflow"
+            android:contentDescription="@*android:string/action_menu_overflow_description"
+            android:nextFocusLeft="@id/digits"
+            android:background="?android:attr/selectableItemBackground"/>
+    </LinearLayout>
 
     <!-- "Dialpad chooser" UI, shown only when the user brings up the
          Dialer while a call is already in progress.
diff --git a/res/layout/empty2.xml b/res/layout/empty2.xml
new file mode 100644
index 0000000..349dcfa
--- /dev/null
+++ b/res/layout/empty2.xml
@@ -0,0 +1,29 @@
+<?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.
+-->
+
+<!-- Hack for show empty hidden menu item without using android:icon.
+     See dialtact_options.xml for more detail.
+
+     TODO: figure out better way -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_dial_action_search"
+        android:visibility="invisible"/>
+</FrameLayout>
diff --git a/res/layout/phone_contact_tile_list.xml b/res/layout/phone_contact_tile_list.xml
new file mode 100644
index 0000000..29ceb19
--- /dev/null
+++ b/res/layout/phone_contact_tile_list.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+
+<!-- Use LinearLayout + FrameLayout, just to rely on android:divider and android:showDividers -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingBottom="?android:attr/actionBarSize"
+    android:divider="?android:attr/dividerHorizontal"
+    android:showDividers="end">
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <ListView
+            android:id="@+id/contact_tile_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingTop="@dimen/contact_tile_list_padding_top"
+            android:clipToPadding="false"
+            android:fadingEdge="none"
+            android:divider="@null" />
+
+        <TextView
+            android:id="@+id/contact_tile_list_empty"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_horizontal"
+            android:layout_marginTop="@dimen/empty_message_top_margin"
+            android:textColor="?android:attr/textColorSecondary"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+    </FrameLayout>
+</LinearLayout>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index 54ca086..d8c79e4 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -37,4 +37,16 @@
         android:id="@+id/add_contact"
         android:title="@string/menu_newContact"
         android:showAsAction="withText" />
+
+    <!-- Ugly hack: empty item never clickable.
+         This is for forcing search icon on left even when there's a single item
+         in the bottom ActionBar.
+         We intentionally don't use android:icon to avoid other issues around item with
+         a null icon.
+
+         TODO: look for better idea. -->
+    <item
+        android:id="@+id/fake_menu_item"
+        android:actionLayout="@layout/empty2"
+        android:showAsAction="ifRoom" />
 </menu>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index ece881e..f22ff1d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -284,7 +284,7 @@
     </style>
 
     <style name="DialtactsActionBarStyle" parent="android:Widget.Holo.ActionBar">
-        <item name="android:backgroundSplit">@drawable/ab_bottom_opaque_dark_holo</item>
+        <item name="android:backgroundSplit">@null</item>
         <item name="android:backgroundStacked">@drawable/ab_stacked_opaque_dark_holo</item>
         <item name="android:displayOptions"></item>
     </style>
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 7e95fed..9abcdf4 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -78,6 +78,8 @@
 public class DialtactsActivity extends TransactionSafeActivity {
     private static final String TAG = "DialtactsActivity";
 
+    private static final boolean DEBUG = false;
+
     /** Used to open Call Setting */
     private static final String PHONE_PACKAGE = "com.android.phone";
     private static final String CALL_SETTINGS_CLASS_NAME =
@@ -143,6 +145,23 @@
         }
     }
 
+    /**
+     * True when the app detects user's drag event. This variable should not become true when
+     * mUserTabClick is true.
+     *
+     * During user's drag or tab click, we shouldn't show fake buttons but just show real
+     * ActionBar at the bottom of the screen, for transition animation.
+     */
+    boolean mDuringSwipe = false;
+    /**
+     * True when the app detects user's tab click (at the top of the screen). This variable should
+     * not become true when mDuringSwipe is true.
+     *
+     * During user's drag or tab click, we shouldn't show fake buttons but just show real
+     * ActionBar at the bottom of the screen, for transition animation.
+     */
+    boolean mUserTabClick = false;
+
     private class PageChangeListener implements OnPageChangeListener {
         private int mCurrentPosition = -1;
         /**
@@ -158,7 +177,17 @@
 
         @Override
         public void onPageSelected(int position) {
+            if (DEBUG) Log.d(TAG, "onPageSelected: " + position);
             final ActionBar actionBar = getActionBar();
+            if (mDialpadFragment != null && !mDuringSwipe) {
+                if (DEBUG) {
+                    Log.d(TAG, "Immediately show/hide fake menu buttons. position: "
+                            + position + ", dragging: " + mDuringSwipe);
+                }
+                mDialpadFragment.updateFakeMenuButtonsVisibility(
+                        position == TAB_INDEX_DIALER && !mDuringSwipe);
+            }
+
             if (mCurrentPosition == position) {
                 Log.w(TAG, "Previous position and next position became same (" + position + ")");
             }
@@ -175,6 +204,11 @@
         public void onPageScrollStateChanged(int state) {
             switch (state) {
                 case ViewPager.SCROLL_STATE_IDLE: {
+                    if (DEBUG) Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_IDLE");
+                    // Interpret IDLE as the end of migration (both swipe and tab click)
+                    mDuringSwipe = false;
+                    mUserTabClick = false;
+
                     if (mCurrentPosition >= 0) {
                         sendFragmentVisibilityChange(mCurrentPosition, false);
                     }
@@ -186,8 +220,24 @@
                     mCurrentPosition = mNextPosition;
                     break;
                 }
-                case ViewPager.SCROLL_STATE_DRAGGING:
-                case ViewPager.SCROLL_STATE_SETTLING:
+                case ViewPager.SCROLL_STATE_DRAGGING: {
+                    if (DEBUG) Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_DRAGGING");
+                    mDuringSwipe = true;
+                    mUserTabClick = false;
+
+                    if (mCurrentPosition == TAB_INDEX_DIALER) {
+                        sendFragmentVisibilityChange(TAB_INDEX_DIALER, false);
+                        sendFragmentVisibilityChange(TAB_INDEX_CALL_LOG, true);
+                        invalidateOptionsMenu();
+                    }
+                    break;
+                }
+                case ViewPager.SCROLL_STATE_SETTLING: {
+                    if (DEBUG) Log.d(TAG, "onPageScrollStateChanged() with SCROLL_STATE_SETTLING");
+                    mDuringSwipe = true;
+                    mUserTabClick = false;
+                    break;
+                }
                 default:
                     break;
             }
@@ -230,10 +280,26 @@
     private final TabListener mTabListener = new TabListener() {
         @Override
         public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            if (DEBUG) Log.d(TAG, "onTabUnselected(). tab: " + tab);
         }
 
         @Override
         public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            if (DEBUG) {
+                Log.d(TAG, "onTabSelected(). tab: " + tab + ", mDuringSwipe: " + mDuringSwipe);
+            }
+            // When the user swipes the screen horizontally, this method will be called after
+            // ViewPager.SCROLL_STATE_DRAGGING and ViewPager.SCROLL_STATE_SETTLING events, while
+            // when the user clicks a tab at the ActionBar at the top, this will be called before
+            // them. This logic interprets the order difference as a difference of the user action.
+            if (!mDuringSwipe) {
+                if (mDialpadFragment != null) {
+                    if (DEBUG) Log.d(TAG, "Immediately hide fake buttons for tab selection case");
+                    mDialpadFragment.updateFakeMenuButtonsVisibility(false);
+                }
+                mUserTabClick = true;
+            }
+
             if (mViewPager.getCurrentItem() != tab.getPosition()) {
                 mViewPager.setCurrentItem(tab.getPosition(), true);
             }
@@ -249,6 +315,7 @@
 
         @Override
         public void onTabReselected(Tab tab, FragmentTransaction ft) {
+            if (DEBUG) Log.d(TAG, "onTabReselected");
         }
     };
 
@@ -436,6 +503,12 @@
         if (mSearchFragment != null) {
             mSearchFragment.setFilter(mContactListFilterController.getFilter());
         }
+
+        if (mDuringSwipe || mUserTabClick) {
+            if (DEBUG) Log.d(TAG, "reset buggy flag state..");
+            mDuringSwipe = false;
+            mUserTabClick = false;
+        }
     }
 
     @Override
@@ -659,6 +732,8 @@
 
         // Restore to the previous manual selection
         mLastManuallySelectedFragment = savedTabIndex;
+        mDuringSwipe = false;
+        mUserTabClick = false;
     }
 
     @Override
@@ -776,6 +851,7 @@
         final MenuItem filterOptionMenuItem = menu.findItem(R.id.filter_option);
         final MenuItem addContactOptionMenuItem = menu.findItem(R.id.add_contact);
         final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings);
+        final MenuItem fakeMenuItem = menu.findItem(R.id.fake_menu_item);
         Tab tab = getActionBar().getSelectedTab();
         if (mInSearchUi) {
             searchMenuItem.setVisible(false);
@@ -792,17 +868,33 @@
                 addContactOptionMenuItem.setVisible(false);
             }
             callSettingsMenuItem.setVisible(false);
+            fakeMenuItem.setVisible(false);
         } else {
             final boolean showCallSettingsMenu;
             if (tab != null && tab.getPosition() == TAB_INDEX_DIALER) {
-                searchMenuItem.setVisible(false);
-                // When permanent menu key is _not_ available, the call settings menu should be
-                // available via DialpadFragment.
-                showCallSettingsMenu = ViewConfiguration.get(this).hasPermanentMenuKey();
+                if (DEBUG) {
+                    Log.d(TAG, "onPrepareOptionsMenu(dialer). swipe: " + mDuringSwipe
+                            + ", user tab click: " + mUserTabClick);
+                }
+                if (mDuringSwipe || mUserTabClick) {
+                    // During horizontal movement, we just show real ActionBar menu items.
+                    searchMenuItem.setVisible(true);
+                    searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener);
+                    showCallSettingsMenu = true;
+
+                    fakeMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey());
+                } else {
+                    searchMenuItem.setVisible(false);
+                    // When permanent menu key is _not_ available, the call settings menu should be
+                    // available via DialpadFragment.
+                    showCallSettingsMenu = ViewConfiguration.get(this).hasPermanentMenuKey();
+                    fakeMenuItem.setVisible(false);
+                }
             } else {
                 searchMenuItem.setVisible(true);
                 searchMenuItem.setOnMenuItemClickListener(mSearchMenuItemClickListener);
                 showCallSettingsMenu = true;
+                fakeMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey());
             }
             if (tab != null && tab.getPosition() == TAB_INDEX_FAVORITES) {
                 filterOptionMenuItem.setVisible(true);
@@ -932,6 +1024,10 @@
 
         sendFragmentVisibilityChange(mViewPager.getCurrentItem(), true);
 
+        // Before exiting the search screen, reset swipe state.
+        mDuringSwipe = false;
+        mUserTabClick = false;
+
         mViewPager.setVisibility(View.VISIBLE);
 
         hideInputMethod(getCurrentFocus());
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index 793717d..cdba30b 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -16,16 +16,6 @@
 
 package com.android.contacts.dialpad;
 
-import com.android.contacts.ContactsUtils;
-import com.android.contacts.R;
-import com.android.contacts.SpecialCharSequenceMgr;
-import com.android.contacts.activities.DialtactsActivity;
-import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
-import com.android.contacts.util.PhoneNumberFormatter;
-import com.android.internal.telephony.ITelephony;
-import com.android.phone.CallLogAsync;
-import com.android.phone.HapticFeedback;
-
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -57,6 +47,7 @@
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.text.method.DialerKeyListener;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -64,20 +55,25 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.PopupMenu;
 import android.widget.TextView;
 
-import java.util.HashSet;
-import java.util.Set;
+import com.android.contacts.ContactsUtils;
+import com.android.contacts.R;
+import com.android.contacts.SpecialCharSequenceMgr;
+import com.android.contacts.activities.DialtactsActivity;
+import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
+import com.android.contacts.util.PhoneNumberFormatter;
+import com.android.internal.telephony.ITelephony;
+import com.android.phone.CallLogAsync;
+import com.android.phone.HapticFeedback;
 
 /**
  * Fragment that displays a twelve-key phone dialpad.
@@ -90,6 +86,8 @@
         ViewPagerVisibilityListener {
     private static final String TAG = DialpadFragment.class.getSimpleName();
 
+    private static final boolean DEBUG = false;
+
     private static final String EMPTY_NUMBER = "";
 
     /** The length of DTMF tones in milliseconds */
@@ -116,11 +114,12 @@
     private ToneGenerator mToneGenerator;
     private Object mToneGeneratorLock = new Object();
     private View mDialpad;
-    private View mAdditionalButtonsRow;
 
     private View mSearchButton;
+    private View mMenuButton;
     private Listener mListener;
 
+    private View mDialButtonContainer;
     private View mDialButton;
     private ListView mDialpadChooser;
     private DialpadChooserAdapter mDialpadChooserAdapter;
@@ -253,15 +252,28 @@
 
         PhoneNumberFormatter.setPhoneNumberFormattingTextWatcher(getActivity(), mDigits);
 
+        DisplayMetrics dm = getResources().getDisplayMetrics();
+        int minCellSize = (int) (56 * dm.density); // 56dip == minimum size of menu buttons
+        int cellCount = dm.widthPixels / minCellSize;
+        int fakeMenuItemWidth = dm.widthPixels / cellCount;
+        if (DEBUG) Log.d(TAG, "The size of fake menu buttons (in pixel): " + fakeMenuItemWidth);
+
         // Soft menu button should appear only when there's no hardware menu button.
-        final View overflowMenuButton = fragmentView.findViewById(R.id.overflow_menu);
-        if (overflowMenuButton != null) {
+        mMenuButton = fragmentView.findViewById(R.id.overflow_menu);
+        if (mMenuButton != null) {
+            mMenuButton.setMinimumWidth(fakeMenuItemWidth);
             if (ViewConfiguration.get(getActivity()).hasPermanentMenuKey()) {
-                overflowMenuButton.setVisibility(View.GONE);
+                // This is required for dialpad button's layout, so must not use GONE here.
+                mMenuButton.setVisibility(View.INVISIBLE);
             } else {
-                overflowMenuButton.setOnClickListener(this);
+                mMenuButton.setOnClickListener(this);
             }
         }
+        mSearchButton = fragmentView.findViewById(R.id.searchButton);
+        if (mSearchButton != null) {
+            mSearchButton.setMinimumWidth(fakeMenuItemWidth);
+            mSearchButton.setOnClickListener(this);
+        }
 
         // Check for the presence of the keypad
         View oneButton = fragmentView.findViewById(R.id.one);
@@ -269,16 +281,8 @@
             setupKeypad(fragmentView);
         }
 
-        mAdditionalButtonsRow = fragmentView.findViewById(R.id.dialpadAdditionalButtons);
-
-        mSearchButton = mAdditionalButtonsRow.findViewById(R.id.searchButton);
-        if (mSearchButton != null) {
-            mSearchButton.setOnClickListener(this);
-        }
-
-        // Check whether we should show the onscreen "Dial" button.
-        mDialButton = mAdditionalButtonsRow.findViewById(R.id.dialButton);
-
+        mDialButtonContainer = fragmentView.findViewById(R.id.dialButtonContainer);
+        mDialButton = fragmentView.findViewById(R.id.dialButton);
         if (r.getBoolean(R.bool.config_show_onscreen_dial_button)) {
             mDialButton.setOnClickListener(this);
         } else {
@@ -286,9 +290,11 @@
             mDialButton = null;
         }
 
-        mDelete = mAdditionalButtonsRow.findViewById(R.id.deleteButton);
-        mDelete.setOnClickListener(this);
-        mDelete.setOnLongClickListener(this);
+        mDelete = fragmentView.findViewById(R.id.deleteButton);
+        if (mDelete != null) {
+            mDelete.setOnClickListener(this);
+            mDelete.setOnLongClickListener(this);
+        }
 
         mDialpad = fragmentView.findViewById(R.id.dialpad);  // This is null in landscape mode.
 
@@ -305,6 +311,8 @@
 
         configureScreenFromIntent(getActivity().getIntent());
 
+        updateFakeMenuButtonsVisibility(mShowOptionsMenu);
+
         return fragmentView;
     }
 
@@ -1040,7 +1048,8 @@
                 mDigits.setVisibility(View.GONE);
             }
             if (mDialpad != null) mDialpad.setVisibility(View.GONE);
-            mAdditionalButtonsRow.setVisibility(View.GONE);
+            if (mDialButtonContainer != null) mDialButtonContainer.setVisibility(View.GONE);
+
             mDialpadChooser.setVisibility(View.VISIBLE);
 
             // Instantiate the DialpadChooserAdapter and hook it up to the
@@ -1057,7 +1066,7 @@
                 mDigits.setVisibility(View.VISIBLE);
             }
             if (mDialpad != null) mDialpad.setVisibility(View.VISIBLE);
-            mAdditionalButtonsRow.setVisibility(View.VISIBLE);
+            if (mDialButtonContainer != null) mDialButtonContainer.setVisibility(View.VISIBLE);
             mDialpadChooser.setVisibility(View.GONE);
         }
     }
@@ -1446,7 +1455,34 @@
     }
 
     @Override
-    public void onVisibilityChanged(boolean visible) {
-        mShowOptionsMenu = visible;
+    public void onVisibilityChanged(boolean fragmentVisible) {
+        mShowOptionsMenu = fragmentVisible;
+        updateFakeMenuButtonsVisibility(fragmentVisible);
+    }
+
+    /**
+     * Update visibility of the search button and menu button at the bottom of dialer screen, which
+     * should be invisible when bottom ActionBar's real items are available and be visible
+     * otherwise.
+     *
+     * @param visible True when visible.
+     */
+    public void updateFakeMenuButtonsVisibility(boolean visible) {
+        if (DEBUG) Log.d(TAG, "updateFakeMenuButtonVisibility(" + visible + ")");
+
+        if (mSearchButton != null) {
+            if (visible) {
+                mSearchButton.setVisibility(View.VISIBLE);
+            } else {
+                mSearchButton.setVisibility(View.INVISIBLE);
+            }
+        }
+        if (mMenuButton != null) {
+            if (visible && !ViewConfiguration.get(getActivity()).hasPermanentMenuKey()) {
+                mMenuButton.setVisibility(View.VISIBLE);
+            } else {
+                mMenuButton.setVisibility(View.INVISIBLE);
+            }
+        }
     }
 }
diff --git a/src/com/android/contacts/list/PhoneFavoriteFragment.java b/src/com/android/contacts/list/PhoneFavoriteFragment.java
index b6e8dd6..7073a57 100644
--- a/src/com/android/contacts/list/PhoneFavoriteFragment.java
+++ b/src/com/android/contacts/list/PhoneFavoriteFragment.java
@@ -239,7 +239,8 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        final View listLayout = inflater.inflate(R.layout.contact_tile_list, container, false);
+        final View listLayout = inflater.inflate(
+                R.layout.phone_contact_tile_list, container, false);
 
         mListView = (ListView) listLayout.findViewById(R.id.contact_tile_list);
         mListView.setItemsCanFocus(true);