Bug fixes for new search ui w/ Dialpad.

- Dialpad now hides if user tries to scroll w/ a search query.
- Search now closes if the user touches the blank area w/o a search query.
- Since we don't even show location results in dialpad search,
  we no longer request location permission in it.

Bug: 67657783,67656915
Test: tba
PiperOrigin-RevId: 172162620
Change-Id: I33a814797a053600e56fb163fd55b0c43e00a9c6
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 164c1ea..791a710 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -124,6 +124,7 @@
 import com.android.dialer.postcall.PostCall;
 import com.android.dialer.proguard.UsedByReflection;
 import com.android.dialer.searchfragment.list.NewSearchFragment;
+import com.android.dialer.searchfragment.list.NewSearchFragment.SearchFragmentListTouchListener;
 import com.android.dialer.simulator.Simulator;
 import com.android.dialer.simulator.SimulatorComponent;
 import com.android.dialer.smartdial.SmartDialNameMatcher;
@@ -161,7 +162,8 @@
         PhoneNumberInteraction.InteractionErrorListener,
         PhoneNumberInteraction.DisambigDialogDismissedListener,
         ActivityCompat.OnRequestPermissionsResultCallback,
-        DialpadListener {
+        DialpadListener,
+        SearchFragmentListTouchListener {
 
   public static final boolean DEBUG = false;
   @VisibleForTesting public static final String TAG_DIALPAD_FRAGMENT = "dialpad";
@@ -1650,6 +1652,17 @@
         : CallInitiationType.Type.REGULAR_SEARCH;
   }
 
+  @Override
+  public boolean onSearchListTouch(MotionEvent event) {
+    if (mIsDialpadShown) {
+      hideDialpadFragment(true, false);
+      if (TextUtils.isEmpty(mDialpadQuery)) {
+        exitSearchUi();
+      }
+    }
+    return false;
+  }
+
   /** Popup menu accessible from the search bar */
   protected class OptionsPopupMenu extends PopupMenu {
 
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index b06f9c3..393b07a 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -33,7 +33,9 @@
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
+import android.view.View.OnTouchListener;
 import android.view.ViewGroup;
 import android.view.animation.Interpolator;
 import android.widget.FrameLayout;
@@ -42,6 +44,7 @@
 import com.android.dialer.animation.AnimUtils;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.common.Assert;
+import com.android.dialer.common.FragmentUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.ThreadUtil;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
@@ -68,7 +71,8 @@
 public final class NewSearchFragment extends Fragment
     implements LoaderCallbacks<Cursor>,
         OnEmptyViewActionButtonClickedListener,
-        CapabilitiesListener {
+        CapabilitiesListener,
+        OnTouchListener {
 
   // Since some of our queries can generate network requests, we should delay them until the user
   // stops typing to prevent generating too much network traffic.
@@ -127,6 +131,7 @@
     emptyContentView = view.findViewById(R.id.empty_view);
     recyclerView = view.findViewById(R.id.recycler_view);
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+    recyclerView.setOnTouchListener(this);
     recyclerView.setAdapter(adapter);
 
     if (!PermissionsUtil.hasContactsReadPermissions(getContext())) {
@@ -340,7 +345,7 @@
     if (!PermissionsUtil.hasLocationPermissions(getContext())
         && !DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(getContext())
             .getBoolean(KEY_LOCATION_PROMPT_DISMISSED, false)) {
-      if (adapter != null) {
+      if (adapter != null && isRegularSearch()) {
         adapter.showLocationPermissionRequest(
             v -> requestLocationPermission(), v -> dismissLocationPermission());
       }
@@ -427,7 +432,28 @@
     return actions;
   }
 
+  // Returns true if currently in Regular Search (as opposed to Dialpad Search).
   private boolean isRegularSearch() {
     return callInitiationType == CallInitiationType.Type.REGULAR_SEARCH;
   }
+
+  @Override
+  public boolean onTouch(View v, MotionEvent event) {
+    if (event.getAction() == MotionEvent.ACTION_UP) {
+      v.performClick();
+    }
+    return FragmentUtils.getParentUnsafe(this, SearchFragmentListTouchListener.class)
+        .onSearchListTouch(event);
+  }
+
+  /** Callback to {@link NewSearchFragment}'s parent to notify when the list is touched. */
+  public interface SearchFragmentListTouchListener {
+
+    /**
+     * Called when the list view in {@link NewSearchFragment} is touched.
+     *
+     * @see OnTouchListener#onTouch(View, MotionEvent)
+     */
+    boolean onSearchListTouch(MotionEvent event);
+  }
 }