diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 74bc8cc..fc557f0 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -49,7 +49,6 @@
 import android.text.TextWatcher;
 import android.view.DragEvent;
 import android.view.Gravity;
-import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
@@ -169,6 +168,7 @@
   private static final String TAG = "DialtactsActivity";
   private static final String KEY_IN_REGULAR_SEARCH_UI = "in_regular_search_ui";
   private static final String KEY_IN_DIALPAD_SEARCH_UI = "in_dialpad_search_ui";
+  private static final String KEY_IN_NEW_SEARCH_UI = "in_new_search_ui";
   private static final String KEY_SEARCH_QUERY = "search_query";
   private static final String KEY_FIRST_LAUNCH = "first_launch";
   private static final String KEY_WAS_CONFIGURATION_CHANGE = "was_configuration_change";
@@ -213,6 +213,8 @@
    */
   private boolean mStateSaved;
 
+  private boolean mIsKeyboardOpen;
+  private boolean mInNewSearch;
   private boolean mIsRestarting;
   private boolean mInDialpadSearch;
   private boolean mInRegularSearch;
@@ -333,27 +335,6 @@
 
   private int mActionBarHeight;
   private int mPreviouslySelectedTabIndex;
-  /** Handles the user closing the soft keyboard. */
-  private final View.OnKeyListener mSearchEditTextLayoutListener =
-      new View.OnKeyListener() {
-        @Override
-        public boolean onKey(View v, int keyCode, KeyEvent event) {
-          if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
-            if (TextUtils.isEmpty(mSearchView.getText().toString())) {
-              // If the search term is empty, close the search UI.
-              PerformanceReport.recordClick(UiAction.Type.CLOSE_SEARCH_WITH_HIDE_BUTTON);
-              maybeExitSearchUi();
-            } else {
-              // If the search term is not empty, show the dialpad fab.
-              if (!mFloatingActionButtonController.isVisible()) {
-                PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH);
-              }
-              showFabInSearchUi();
-            }
-          }
-          return false;
-        }
-      };
 
   /**
    * The text returned from a voice search query. Set in {@link #onActivityResult} and used in
@@ -413,30 +394,20 @@
 
     SearchEditTextLayout searchEditTextLayout =
         actionBar.getCustomView().findViewById(R.id.search_view_container);
-    searchEditTextLayout.setPreImeKeyListener(mSearchEditTextLayoutListener);
 
     mActionBarController = new ActionBarController(this, searchEditTextLayout);
 
     mSearchView = searchEditTextLayout.findViewById(R.id.search_view);
     mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
     mSearchView.setHint(getSearchBoxHint());
+
     mVoiceSearchButton = searchEditTextLayout.findViewById(R.id.voice_search_button);
     searchEditTextLayout
         .findViewById(R.id.search_box_collapsed)
         .setOnClickListener(mSearchViewOnClickListener);
-    searchEditTextLayout.setCallback(
-        new SearchEditTextLayout.Callback() {
-          @Override
-          public void onBackButtonClicked() {
-            onBackPressed();
-          }
-
-          @Override
-          public void onSearchViewClicked() {
-            // Hide FAB, as the keyboard is shown.
-            mFloatingActionButtonController.scaleOut();
-          }
-        });
+    searchEditTextLayout
+        .findViewById(R.id.search_back_button)
+        .setOnClickListener(v -> exitSearchUi());
 
     mIsLandscape =
         getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
@@ -463,6 +434,7 @@
       mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
       mInRegularSearch = savedInstanceState.getBoolean(KEY_IN_REGULAR_SEARCH_UI);
       mInDialpadSearch = savedInstanceState.getBoolean(KEY_IN_DIALPAD_SEARCH_UI);
+      mInNewSearch = savedInstanceState.getBoolean(KEY_IN_NEW_SEARCH_UI);
       mFirstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH);
       mWasConfigurationChange = savedInstanceState.getBoolean(KEY_WAS_CONFIGURATION_CHANGE);
       mShowDialpadOnResume = savedInstanceState.getBoolean(KEY_IS_DIALPAD_SHOWN);
@@ -657,6 +629,7 @@
     outState.putString(KEY_SEARCH_QUERY, mSearchQuery);
     outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, mInRegularSearch);
     outState.putBoolean(KEY_IN_DIALPAD_SEARCH_UI, mInDialpadSearch);
+    outState.putBoolean(KEY_IN_NEW_SEARCH_UI, mInNewSearch);
     outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch);
     outState.putBoolean(KEY_IS_DIALPAD_SHOWN, mIsDialpadShown);
     outState.putBoolean(KEY_WAS_CONFIGURATION_CHANGE, isChangingConfigurations());
@@ -896,14 +869,19 @@
     updateSearchFragmentPosition();
   }
 
+  @Override
+  public void onCallPlacedFromDialpad() {
+    hideDialpadFragment(false /* animate */, true /*clearDialpad */);
+    exitSearchUi();
+  }
+
   /**
    * Initiates animations and other visual updates to hide the dialpad. The fragment is hidden in a
    * callback after the hide animation ends.
    *
    * @see #commitDialpadFragmentHide
    */
-  @Override
-  public void hideDialpadFragment(boolean animate, boolean clearDialpad) {
+  private void hideDialpadFragment(boolean animate, boolean clearDialpad) {
     LogUtil.enterBlock("DialtactsActivity.hideDialpadFragment");
     if (mDialpadFragment == null || mDialpadFragment.getView() == null) {
       return;
@@ -938,11 +916,6 @@
 
     mActionBarController.onDialpadDown();
 
-    if (isInSearchUi()) {
-      if (TextUtils.isEmpty(mSearchQuery)) {
-        exitSearchUi();
-      }
-    }
     // reset the title to normal.
     setTitle(R.string.launcherActivityLabel);
   }
@@ -990,7 +963,7 @@
 
   @Override
   public boolean isInSearchUi() {
-    return mInDialpadSearch || mInRegularSearch;
+    return mInDialpadSearch || mInRegularSearch || mInNewSearch;
   }
 
   @Override
@@ -1001,6 +974,7 @@
   private void setNotInSearchUi() {
     mInDialpadSearch = false;
     mInRegularSearch = false;
+    mInNewSearch = false;
   }
 
   private void hideDialpadAndSearchUi() {
@@ -1174,17 +1148,21 @@
     }
 
     final String tag;
+    mInDialpadSearch = false;
+    mInRegularSearch = false;
+    mInNewSearch = false;
     boolean useNewSearch =
         ConfigProviderBindings.get(this).getBoolean("enable_new_search_fragment", false);
     if (useNewSearch) {
       tag = TAG_NEW_SEARCH_FRAGMENT;
+      mInNewSearch = true;
     } else if (smartDialSearch) {
       tag = TAG_SMARTDIAL_SEARCH_FRAGMENT;
+      mInDialpadSearch = true;
     } else {
       tag = TAG_REGULAR_SEARCH_FRAGMENT;
+      mInRegularSearch = true;
     }
-    mInDialpadSearch = smartDialSearch;
-    mInRegularSearch = !smartDialSearch;
 
     mFloatingActionButtonController.scaleOut();
 
@@ -1308,45 +1286,36 @@
       return;
     }
     if (mIsDialpadShown) {
-      if (TextUtils.isEmpty(mSearchQuery)
-          || (mSmartDialSearchFragment != null
-              && mSmartDialSearchFragment.isVisible()
-              && mSmartDialSearchFragment.getAdapter().getCount() == 0)) {
-        exitSearchUi();
-      }
       hideDialpadFragment(true, false);
     } else if (isInSearchUi()) {
-      exitSearchUi();
-      DialerUtils.hideInputMethod(mParentLayout);
+      if (mIsKeyboardOpen) {
+        DialerUtils.hideInputMethod(mParentLayout);
+        PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH);
+      } else {
+        exitSearchUi();
+      }
     } else {
       super.onBackPressed();
     }
   }
 
+  @Override
+  public void onConfigurationChanged(Configuration configuration) {
+    super.onConfigurationChanged(configuration);
+    // Checks whether a hardware keyboard is available
+    if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
+      mIsKeyboardOpen = true;
+    } else if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
+      mIsKeyboardOpen = false;
+    }
+  }
+
   private void maybeEnterSearchUi() {
     if (!isInSearchUi()) {
       enterSearchUi(true /* isSmartDial */, mSearchQuery, false);
     }
   }
 
-  /** @return True if the search UI was exited, false otherwise */
-  private boolean maybeExitSearchUi() {
-    if (isInSearchUi() && TextUtils.isEmpty(mSearchQuery)) {
-      exitSearchUi();
-      DialerUtils.hideInputMethod(mParentLayout);
-      return true;
-    }
-    return false;
-  }
-
-  private void showFabInSearchUi() {
-    mFloatingActionButtonController.changeIcon(
-        getResources().getDrawable(R.drawable.quantum_ic_dialpad_white_24, null),
-        getResources().getString(R.string.action_menu_dialpad_button));
-    mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
-    mFloatingActionButtonController.scaleIn(FAB_SCALE_IN_DELAY_MS);
-  }
-
   @Override
   public void onDialpadQueryChanged(String query) {
     mDialpadQuery = query;
diff --git a/java/com/android/dialer/app/widget/ActionBarController.java b/java/com/android/dialer/app/widget/ActionBarController.java
index c1b4cc2..3daa0e2 100644
--- a/java/com/android/dialer/app/widget/ActionBarController.java
+++ b/java/com/android/dialer/app/widget/ActionBarController.java
@@ -49,18 +49,6 @@
         }
       };
 
-  private final AnimationCallback mFadeInCallback =
-      new AnimationCallback() {
-        @Override
-        public void onAnimationEnd() {
-          slideActionBar(false /* slideUp */, false /* animate */);
-        }
-
-        @Override
-        public void onAnimationCancel() {
-          slideActionBar(false /* slideUp */, false /* animate */);
-        }
-      };
   private ValueAnimator mAnimator;
 
   public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) {
@@ -112,17 +100,13 @@
         mSearchBox.isFadedOut(),
         mSearchBox.isExpanded());
     if (mActivityUi.isInSearchUi()) {
-      if (mActivityUi.hasSearchQuery()) {
-        if (mSearchBox.isFadedOut()) {
-          mSearchBox.setVisible(true);
-        }
-        if (!mSearchBox.isExpanded()) {
-          mSearchBox.expand(false /* animate */, false /* requestFocus */);
-        }
-        slideActionBar(false /* slideUp */, true /* animate */);
-      } else {
-        mSearchBox.fadeIn(mFadeInCallback);
+      if (mSearchBox.isFadedOut()) {
+        mSearchBox.setVisible(true);
       }
+      if (!mSearchBox.isExpanded()) {
+        mSearchBox.expand(false /* animate */, false /* requestFocus */);
+      }
+      slideActionBar(false /* slideUp */, true /* animate */);
     }
   }
 
diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
index 95bd12a..2051b65 100644
--- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java
+++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
@@ -23,7 +23,6 @@
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
-import android.view.KeyEvent;
 import android.view.View;
 import android.widget.EditText;
 import android.widget.FrameLayout;
@@ -38,7 +37,6 @@
   /* Subclass-visible for testing */
   protected boolean mIsExpanded = false;
   protected boolean mIsFadedOut = false;
-  private OnKeyListener mPreImeKeyListener;
   private int mTopMargin;
   private int mBottomMargin;
   private int mLeftMargin;
@@ -56,20 +54,10 @@
 
   private ValueAnimator mAnimator;
 
-  private Callback mCallback;
-
   public SearchEditTextLayout(Context context, AttributeSet attrs) {
     super(context, attrs);
   }
 
-  public void setPreImeKeyListener(OnKeyListener listener) {
-    mPreImeKeyListener = listener;
-  }
-
-  public void setCallback(Callback listener) {
-    mCallback = listener;
-  }
-
   @Override
   protected void onFinishInflate() {
     MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
@@ -82,7 +70,7 @@
 
     mCollapsed = findViewById(R.id.search_box_collapsed);
     mExpanded = findViewById(R.id.search_box_expanded);
-    mSearchView = (EditText) mExpanded.findViewById(R.id.search_view);
+    mSearchView = mExpanded.findViewById(R.id.search_view);
 
     mSearchIcon = findViewById(R.id.search_magnifying_glass);
     mCollapsedSearchBox = findViewById(R.id.search_box_start_search);
@@ -123,16 +111,6 @@
           }
         });
 
-    mSearchView.setOnClickListener(
-        new View.OnClickListener() {
-          @Override
-          public void onClick(View v) {
-            if (mCallback != null) {
-              mCallback.onSearchViewClicked();
-            }
-          }
-        });
-
     mSearchView.addTextChangedListener(
         new TextWatcher() {
           @Override
@@ -147,43 +125,10 @@
           public void afterTextChanged(Editable s) {}
         });
 
-    findViewById(R.id.search_close_button)
-        .setOnClickListener(
-            new OnClickListener() {
-              @Override
-              public void onClick(View v) {
-                mSearchView.setText(null);
-              }
-            });
-
-    findViewById(R.id.search_back_button)
-        .setOnClickListener(
-            new OnClickListener() {
-              @Override
-              public void onClick(View v) {
-                if (mCallback != null) {
-                  mCallback.onBackButtonClicked();
-                }
-              }
-            });
-
+    mClearButtonView.setOnClickListener(v -> mSearchView.setText(null));
     super.onFinishInflate();
   }
 
-  @Override
-  public boolean dispatchKeyEventPreIme(KeyEvent event) {
-    if (mPreImeKeyListener != null) {
-      if (mPreImeKeyListener.onKey(this, event.getKeyCode(), event)) {
-        return true;
-      }
-    }
-    return super.dispatchKeyEventPreIme(event);
-  }
-
-  public void fadeOut() {
-    fadeOut(null);
-  }
-
   public void fadeOut(AnimUtils.AnimationCallback callback) {
     AnimUtils.fadeOut(this, ANIMATION_DURATION, callback);
     mIsFadedOut = true;
@@ -324,12 +269,4 @@
     params.rightMargin = (int) (mRightMargin * fraction);
     requestLayout();
   }
-
-  /** Listener for the back button next to the search view being pressed */
-  public interface Callback {
-
-    void onBackButtonClicked();
-
-    void onSearchViewClicked();
-  }
 }
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 86a8379..837c3af 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -1001,12 +1001,12 @@
     DialerUtils.startActivityWithErrorToast(
         getActivity(),
         new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.DIALPAD).build());
-    hideAndClearDialpad(false);
+    hideAndClearDialpad();
   }
 
-  private void hideAndClearDialpad(boolean animate) {
+  private void hideAndClearDialpad() {
     LogUtil.enterBlock("DialpadFragment.hideAndClearDialpad");
-    FragmentUtils.getParentUnsafe(this, DialpadListener.class).hideDialpadFragment(animate, true);
+    FragmentUtils.getParentUnsafe(this, DialpadListener.class).onCallPlacedFromDialpad();
   }
 
   /**
@@ -1053,7 +1053,7 @@
         final Intent intent =
             new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD).build();
         DialerUtils.startActivityWithErrorToast(getActivity(), intent);
-        hideAndClearDialpad(false);
+        hideAndClearDialpad();
       }
     }
   }
@@ -1297,7 +1297,7 @@
       return true;
     } else if (resId == R.id.menu_call_with_note) {
       CallSubjectDialog.start(getActivity(), mDigits.getText().toString());
-      hideAndClearDialpad(false);
+      hideAndClearDialpad();
       return true;
     } else {
       return false;
@@ -1710,7 +1710,7 @@
 
     void onDialpadShown();
 
-    void hideDialpadFragment(boolean animate, boolean value);
+    void onCallPlacedFromDialpad();
   }
 
   /** Callback for async lookup of the last number dialed. */
