Keyboard and search now close when appropriate.

Keyboard should close when:
 - requeting permission
 - placing a call
 - leaving the app

Search should close when:
 - placing a call
 - leaving the app

Bug: 74235853
Test: search closing onPause tests already exist (MainActivityOldPeerSearchIntegrationTest#placingCallFromSearchClosesSearch)
PiperOrigin-RevId: 188812026
Change-Id: Iaee084c59b4c514d10375deff5d73d5a456ef9df
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 37b241b..465c579 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -1727,6 +1727,9 @@
     clearSearchOnPause = true;
   }
 
+  @Override
+  public void requestingPermission() {}
+
   protected int getPreviouslySelectedTabIndex() {
     return previouslySelectedTabIndex;
   }
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 7d57f98..92e5651 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -86,6 +86,14 @@
 
   private final List<OnSearchShowListener> onSearchShowListenerList = new ArrayList<>();
 
+  /**
+   * True when an action happens that closes search (like leaving the app or placing a call). We
+   * want to wait until onPause is called otherwise the transition will look extremely janky.
+   */
+  private boolean closeSearchOnPause;
+
+  private boolean requestingPermission;
+
   public MainSearchController(
       MainActivity mainActivity,
       BottomNavBar bottomNav,
@@ -444,15 +452,35 @@
   }
 
   @Override
+  public void onActivityPause() {
+    if (closeSearchOnPause) {
+      closeSearchOnPause = false;
+      if (isInSearch()) {
+        closeSearch(false);
+      }
+    }
+  }
+
+  @Override
   public void onUserLeaveHint() {
     if (isInSearch()) {
-      closeSearch(false);
+      // Requesting a permission causes this to be called and we want search to remain open when
+      // that happens. Otherwise, close search.
+      closeSearchOnPause = !requestingPermission;
+
+      // Always hide the keyboard when the user leaves dialer (including permission requests)
+      toolbar.hideKeyboard();
     }
   }
 
   @Override
   public void onCallPlacedFromSearch() {
-    closeSearch(false);
+    closeSearchOnPause = true;
+  }
+
+  @Override
+  public void requestingPermission() {
+    requestingPermission = true;
   }
 
   public void onVoiceResults(int resultCode, Intent data) {
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index 3c335b3..b617646 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -447,7 +447,9 @@
   }
 
   @Override
-  public void onActivityPause() {}
+  public void onActivityPause() {
+    searchController.onActivityPause();
+  }
 
   @Override
   public void onActivityStop() {
@@ -676,6 +678,11 @@
       // TODO(calderwoodra): logging
       searchController.onCallPlacedFromSearch();
     }
+
+    @Override
+    public void requestingPermission() {
+      searchController.requestingPermission();
+    }
   }
 
   /** @see DialpadFragment.HostInterface */
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
index 857c4b9..d01fe3a 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.main.impl.toolbar;
 
+import android.app.Activity;
 import android.support.v7.app.AppCompatActivity;
 import android.view.MenuItem;
 
@@ -37,12 +38,18 @@
   /** Called when a toolbar menu item is clicked. */
   boolean onMenuItemClicked(MenuItem menuItem);
 
+  /** Called when {@link Activity#onPause()} is called. */
+  void onActivityPause();
+
   /** Called when {@link AppCompatActivity#onUserLeaveHint()} is called. */
   void onUserLeaveHint();
 
   /** Called when the user places a call from search (regular or dialpad). */
   void onCallPlacedFromSearch();
 
+  /** Called when a permission is about to be requested. */
+  void requestingPermission();
+
   /** Interface for returning voice results to the search bar. */
   interface VoiceSearchResultCallback {
 
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index aff9462..6a60598 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -29,7 +29,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
-import android.support.v13.app.FragmentCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.telephony.PhoneNumberUtils;
@@ -342,8 +341,8 @@
       LogUtil.i(
           "NewSearchFragment.onEmptyViewActionButtonClicked",
           "Requesting permissions: " + Arrays.toString(deniedPermissions));
-      FragmentCompat.requestPermissions(
-          this, deniedPermissions, READ_CONTACTS_PERMISSION_REQUEST_CODE);
+      FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).requestingPermission();
+      requestPermissions(deniedPermissions, READ_CONTACTS_PERMISSION_REQUEST_CODE);
     }
   }
 
@@ -411,6 +410,7 @@
     String[] deniedPermissions =
         PermissionsUtil.getPermissionsCurrentlyDenied(
             getContext(), PermissionsUtil.allLocationGroupPermissionsUsedInDialer);
+    FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).requestingPermission();
     requestPermissions(deniedPermissions, LOCATION_PERMISSION_REQUEST_CODE);
   }
 
@@ -557,5 +557,8 @@
 
     /** Called when a call is placed from the search fragment. */
     void onCallPlacedFromSearch();
+
+    /** Called when a permission is about to be requested. */
+    void requestingPermission();
   }
 }