Fix some bugs in the new SearchFragment.

Call initiation type is now correct.

from the bug:
1. Messed up UI on taking off Contacts permission.
12. Phone app crash on doing voice search
21. fragment can get into weird state where it resets to
show all contacts even when there is a query in the search box.

Bug: 64902476
Test: manual
PiperOrigin-RevId: 166567893
Change-Id: I343f9c659ae83065b1b535e3d6c120ed723a0ed5
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 04545b5..01bdfc2 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -93,6 +93,7 @@
 import com.android.dialer.app.widget.SearchEditTextLayout;
 import com.android.dialer.callcomposer.CallComposerActivity;
 import com.android.dialer.calldetails.CallDetailsActivity;
+import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.callintent.CallSpecificAppData;
 import com.android.dialer.common.Assert;
@@ -305,8 +306,11 @@
             mSmartDialSearchFragment.setQueryString(mSearchQuery);
           } else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) {
             mRegularSearchFragment.setQueryString(mSearchQuery);
-          } else if (mNewSearchFragment != null) {
+          } else if (mNewSearchFragment != null && mNewSearchFragment.isVisible()) {
             mNewSearchFragment.setQuery(mSearchQuery);
+            // When the user switches between dialpad and the serachbar, we need to reset the
+            // call initiation type.
+            mNewSearchFragment.setCallInitiationType(getCallInitiationType());
           }
         }
 
@@ -965,9 +969,10 @@
       fragment.updatePosition(true /* animate */);
     } else if (mNewSearchFragment != null) {
       int animationDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration);
+      int actionbarHeight = getResources().getDimensionPixelSize(R.dimen.action_bar_height_large);
       int shadowHeight = getResources().getDrawable(R.drawable.search_shadow).getIntrinsicHeight();
-      int start = isDialpadShown() ? mActionBarHeight - shadowHeight : 0;
-      int end = isDialpadShown() ? 0 : mActionBarHeight - shadowHeight;
+      int start = isDialpadShown() ? actionbarHeight - shadowHeight : 0;
+      int end = isDialpadShown() ? 0 : actionbarHeight - shadowHeight;
       mNewSearchFragment.animatePosition(start, end, animationDuration);
     }
   }
@@ -1209,6 +1214,7 @@
       ((SearchFragment) fragment).setQueryString(query);
     } else if (useNewSearch) {
       ((NewSearchFragment) fragment).setQuery(query);
+      ((NewSearchFragment) fragment).setCallInitiationType(getCallInitiationType());
     }
     transaction.commit();
 
@@ -1596,6 +1602,12 @@
     return isMultiSelectModeEnabled;
   }
 
+  private CallInitiationType.Type getCallInitiationType() {
+    return mIsDialpadShown
+        ? CallInitiationType.Type.DIALPAD
+        : CallInitiationType.Type.REGULAR_SEARCH;
+  }
+
   /** Popup menu accessible from the search bar */
   protected class OptionsPopupMenu extends PopupMenu {
 
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
index d75a661..84fd64a 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
@@ -20,12 +20,16 @@
 import android.content.CursorLoader;
 import android.database.Cursor;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.annotation.Nullable;
 import com.android.dialer.searchfragment.common.Projections;
 
 /** Cursor Loader for CP2 contacts. */
 public final class SearchContactsCursorLoader extends CursorLoader {
 
-  public SearchContactsCursorLoader(Context context) {
+  private final String query;
+
+  /** @param query Contacts cursor will be filtered based on this query. */
+  public SearchContactsCursorLoader(Context context, @Nullable String query) {
     super(
         context,
         Phone.CONTENT_URI,
@@ -33,6 +37,7 @@
         null,
         null,
         Phone.SORT_KEY_PRIMARY + " ASC");
+    this.query = query;
   }
 
   @Override
@@ -40,7 +45,7 @@
     // All contacts
     Cursor cursor = super.loadInBackground();
     // Filtering logic
-    ContactFilterCursor contactFilterCursor = new ContactFilterCursor(cursor, null);
+    ContactFilterCursor contactFilterCursor = new ContactFilterCursor(cursor, query);
     // Header logic
     return SearchContactsCursor.newInstnace(getContext(), contactFilterCursor);
   }
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index 7d355c9..7fee969 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -34,6 +34,7 @@
 import android.view.animation.Interpolator;
 import com.android.contacts.common.extensions.PhoneDirectoryExtenderAccessor;
 import com.android.dialer.animation.AnimUtils;
+import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.ThreadUtil;
@@ -77,6 +78,7 @@
   private RecyclerView recyclerView;
   private SearchAdapter adapter;
   private String query;
+  private CallInitiationType.Type callInitiationType = CallInitiationType.Type.UNKNOWN_INITIATION;
   private boolean remoteDirectoriesDisabledForTesting;
 
   private final List<Directory> directories = new ArrayList<>();
@@ -94,6 +96,7 @@
       LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle bundle) {
     View view = inflater.inflate(R.layout.fragment_search, parent, false);
     adapter = new SearchAdapter(getActivity(), new SearchCursorManager());
+    adapter.setCallInitiationType(callInitiationType);
     emptyContentView = view.findViewById(R.id.empty_view);
     recyclerView = view.findViewById(R.id.recycler_view);
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
@@ -123,9 +126,8 @@
 
   @Override
   public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
-    // TODO(calderwoodra) add enterprise loader
     if (id == CONTACTS_LOADER_ID) {
-      return new SearchContactsCursorLoader(getContext());
+      return new SearchContactsCursorLoader(getContext(), query);
     } else if (id == NEARBY_PLACES_LOADER_ID) {
       return new NearbyPlacesCursorLoader(getContext(), query);
     } else if (id == REMOTE_DIRECTORIES_LOADER_ID) {
@@ -182,6 +184,13 @@
     }
   }
 
+  public void setCallInitiationType(CallInitiationType.Type callInitiationType) {
+    this.callInitiationType = callInitiationType;
+    if (adapter != null) {
+      adapter.setCallInitiationType(callInitiationType);
+    }
+  }
+
   public void animatePosition(int start, int end, int duration) {
     // Called before the view is ready, prepare a runnable to run in onCreateView
     if (getView() == null) {
diff --git a/java/com/android/dialer/searchfragment/list/SearchAdapter.java b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
index 4cb44a2..f08d60e 100644
--- a/java/com/android/dialer/searchfragment/list/SearchAdapter.java
+++ b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
@@ -25,7 +25,6 @@
 import android.view.ViewGroup;
 import com.android.dialer.callcomposer.CallComposerActivity;
 import com.android.dialer.callintent.CallInitiationType;
-import com.android.dialer.callintent.CallInitiationType.Type;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.callintent.CallSpecificAppData;
 import com.android.dialer.common.Assert;
@@ -51,6 +50,7 @@
   private final Activity activity;
 
   private String query;
+  private CallInitiationType.Type callInitiationType = CallInitiationType.Type.UNKNOWN_INITIATION;
 
   @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
   public SearchAdapter(Activity activity, SearchCursorManager searchCursorManager) {
@@ -124,6 +124,10 @@
     }
   }
 
+  void setCallInitiationType(CallInitiationType.Type callInitiationType) {
+    this.callInitiationType = callInitiationType;
+  }
+
   public void setNearbyPlacesCursor(SearchCursor nearbyPlacesCursor) {
     if (searchCursorManager.setNearbyPlacesCursor(nearbyPlacesCursor)) {
       notifyDataSetChanged();
@@ -149,7 +153,7 @@
   private void placeCall(String phoneNumber, int position, boolean isVideoCall) {
     CallSpecificAppData callSpecificAppData =
         CallSpecificAppData.newBuilder()
-            .setCallInitiationType(getCallInitiationType())
+            .setCallInitiationType(callInitiationType)
             .setPositionOfSelectedSearchResult(position)
             .setCharactersInSearchString(query == null ? 0 : query.length())
             .build();
@@ -172,9 +176,4 @@
     Intent intent = CallComposerActivity.newIntent(activity, contact);
     DialerUtils.startActivityWithErrorToast(activity, intent);
   }
-
-  private CallInitiationType.Type getCallInitiationType() {
-    // TODO(calderwoodra): add correct initiation type
-    return Type.REGULAR_SEARCH;
-  }
 }