Fixed some bugs in NUI search.

 - Nearby places promo now displays properly
 - Dialpad now properly handles dial intents
 - placing calls from search now closes search
 - placing calls from search now closes the keyboard
 - toolbar shadow is now visible when search is started
   from the dialpad.

Bug: 72525324
Test: MainActivityOldPeerSearchIntegrationTest
PiperOrigin-RevId: 186390952
Change-Id: I7e10ef0499c787da2d1820cae915f2d42645303b
diff --git a/java/com/android/contacts/common/model/ContactLoader.java b/java/com/android/contacts/common/model/ContactLoader.java
index d2c7577..51b8e3e 100644
--- a/java/com/android/contacts/common/model/ContactLoader.java
+++ b/java/com/android/contacts/common/model/ContactLoader.java
@@ -218,7 +218,7 @@
 
   @Override
   public Contact loadInBackground() {
-    LogUtil.e(TAG, "loadInBackground=" + mLookupUri);
+    LogUtil.v(TAG, "loadInBackground=" + mLookupUri);
     try {
       final ContentResolver resolver = getContext().getContentResolver();
       final Uri uriCurrentFormat = ContactLoaderUtils.ensureIsContactUri(resolver, mLookupUri);
diff --git a/java/com/android/dialer/main/MainActivityPeer.java b/java/com/android/dialer/main/MainActivityPeer.java
index c1a328a..9c5627b 100644
--- a/java/com/android/dialer/main/MainActivityPeer.java
+++ b/java/com/android/dialer/main/MainActivityPeer.java
@@ -26,6 +26,8 @@
 
   void onActivityResume();
 
+  void onUserLeaveHint();
+
   void onActivityStop();
 
   void onActivityDestroyed();
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index ac2cb38..1646bec 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -82,6 +82,7 @@
   @Override
   protected void onNewIntent(Intent intent) {
     super.onNewIntent(intent);
+    setIntent(intent);
     activePeer.onNewIntent(intent);
   }
 
@@ -92,6 +93,12 @@
   }
 
   @Override
+  protected void onUserLeaveHint() {
+    super.onUserLeaveHint();
+    activePeer.onUserLeaveHint();
+  }
+
+  @Override
   protected void onStop() {
     super.onStop();
     activePeer.onActivityStop();
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 8d9e784..ccd7a4b 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -95,12 +95,14 @@
   }
 
   /** Should be called if we're showing the dialpad because of a new ACTION_DIAL intent. */
-  public void showDialpadFromNewIntent(boolean animate) {
-    showDialpad(animate, true);
+  public void showDialpadFromNewIntent() {
+    LogUtil.enterBlock("MainSearchController.showDialpadFromNewIntent");
+    showDialpad(/* animate=*/ false, /* fromNewIntent=*/ true);
   }
 
   /** Shows the dialpad, hides the FAB and slides the toolbar off screen. */
   public void showDialpad(boolean animate) {
+    LogUtil.enterBlock("MainSearchController.showDialpad");
     showDialpad(animate, false);
   }
 
@@ -110,17 +112,22 @@
     fab.hide();
     toolbar.slideUp(animate);
     toolbar.expand(animate, Optional.absent());
+    toolbarShadow.setVisibility(View.VISIBLE);
     mainActivity.setTitle(R.string.dialpad_activity_title);
 
     FragmentTransaction transaction = mainActivity.getFragmentManager().beginTransaction();
+    NewSearchFragment searchFragment = getSearchFragment();
 
     // Show Search
-    if (getSearchFragment() == null) {
-      NewSearchFragment searchFragment = NewSearchFragment.newInstance(false);
+    if (searchFragment == null) {
+      // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby
+      // places promo to be shown.
+      searchFragment = NewSearchFragment.newInstance(/* showZeroSuggest=*/ true);
       transaction.add(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG);
     } else if (!isSearchVisible()) {
-      transaction.show(getSearchFragment());
+      transaction.show(searchFragment);
     }
+    searchFragment.setQuery("", CallInitiationType.Type.DIALPAD);
 
     // Show Dialpad
     if (getDialpadFragment() == null) {
@@ -145,6 +152,7 @@
    * @see {@link #closeSearch(boolean)} to "remove" the dialpad.
    */
   private void hideDialpad(boolean animate, boolean bottomNavVisible) {
+    LogUtil.enterBlock("MainSearchController.hideDialpad");
     Assert.checkArgument(isDialpadVisible());
 
     fab.show();
@@ -190,6 +198,7 @@
 
   /** Should be called when {@link DialpadListener#onDialpadShown()} is called. */
   public void onDialpadShown() {
+    LogUtil.enterBlock("MainSearchController.onDialpadShown");
     getDialpadFragment().slideUp(true);
     hideBottomNav();
   }
@@ -205,6 +214,7 @@
    *     </ol>
    */
   public void onSearchListTouch() {
+    LogUtil.enterBlock("MainSearchController.onSearchListTouched");
     if (isDialpadVisible()) {
       if (TextUtils.isEmpty(getDialpadFragment().getQuery())) {
         Logger.get(mainActivity)
@@ -236,13 +246,13 @@
    */
   public boolean onBackPressed() {
     if (isDialpadVisible() && !TextUtils.isEmpty(getDialpadFragment().getQuery())) {
-      LogUtil.i("MainSearchController#onBackPressed", "Dialpad visible with query");
+      LogUtil.i("MainSearchController.onBackPressed", "Dialpad visible with query");
       Logger.get(mainActivity)
           .logImpression(DialerImpression.Type.NUI_PRESS_BACK_BUTTON_TO_HIDE_DIALPAD);
       hideDialpad(/* animate=*/ true, /* bottomNavVisible=*/ false);
       return true;
     } else if (isSearchVisible()) {
-      LogUtil.i("MainSearchController#onBackPressed", "Search is visible");
+      LogUtil.i("MainSearchController.onBackPressed", "Search is visible");
       Logger.get(mainActivity)
           .logImpression(
               isDialpadVisible()
@@ -260,6 +270,7 @@
    * dialpad.
    */
   private void closeSearch(boolean animate) {
+    LogUtil.enterBlock("MainSearchController.closeSearch");
     Assert.checkArgument(isSearchVisible());
     if (isDialpadVisible()) {
       hideDialpad(animate, /* bottomNavVisible=*/ true);
@@ -314,11 +325,13 @@
    */
   @Override
   public void onSearchBarClicked() {
+    LogUtil.enterBlock("MainSearchController.onSearchBarClicked");
     Logger.get(mainActivity).logImpression(DialerImpression.Type.NUI_CLICK_SEARCH_BAR);
     openSearch(Optional.absent());
   }
 
   private void openSearch(Optional<String> query) {
+    LogUtil.enterBlock("MainSearchController.openSearch");
     fab.hide();
     toolbar.expand(/* animate=*/ true, query);
     toolbar.showKeyboard();
@@ -326,20 +339,26 @@
     hideBottomNav();
 
     FragmentTransaction transaction = mainActivity.getFragmentManager().beginTransaction();
+    NewSearchFragment searchFragment = getSearchFragment();
 
     // Show Search
-    if (getSearchFragment() == null) {
-      NewSearchFragment searchFragment = NewSearchFragment.newInstance(false);
+    if (searchFragment == null) {
+      // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby
+      // places promo to be shown.
+      searchFragment = NewSearchFragment.newInstance(true);
       transaction.add(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG);
     } else if (!isSearchVisible()) {
       transaction.show(getSearchFragment());
     }
 
+    searchFragment.setQuery(
+        query.isPresent() ? query.get() : "", CallInitiationType.Type.REGULAR_SEARCH);
     transaction.commit();
   }
 
   @Override
   public void onSearchBackButtonClicked() {
+    LogUtil.enterBlock("MainSearchController.onSearchBackButtonClicked");
     closeSearch(true);
   }
 
@@ -384,6 +403,18 @@
     return false;
   }
 
+  @Override
+  public void onUserLeaveHint() {
+    if (isInSearch()) {
+      closeSearch(false);
+    }
+  }
+
+  @Override
+  public void onCallPlacedFromSearch() {
+    closeSearch(false);
+  }
+
   public void onVoiceResults(int resultCode, Intent data) {
     if (resultCode == AppCompatActivity.RESULT_OK) {
       ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
diff --git a/java/com/android/dialer/main/impl/NewMainActivityPeer.java b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
index ed67df9..6f5c186 100644
--- a/java/com/android/dialer/main/impl/NewMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
@@ -57,6 +57,9 @@
   public void onActivityResume() {}
 
   @Override
+  public void onUserLeaveHint() {}
+
+  @Override
   public void onActivityStop() {}
 
   @Override
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index 7d9216c..69d8032 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -226,34 +226,34 @@
       searchController.onRestoreInstanceState(savedInstanceState);
       bottomNav.selectTab(savedInstanceState.getInt(KEY_CURRENT_TAB));
     } else {
-      showTabOnIntent(mainActivity.getIntent());
+      onHandleIntent(mainActivity.getIntent());
     }
   }
 
   @Override
   public void onNewIntent(Intent intent) {
     LogUtil.enterBlock("OldMainActivityPeer.onNewIntent");
-    showTabOnIntent(intent);
+    onHandleIntent(intent);
   }
 
-  private void showTabOnIntent(Intent intent) {
+  private void onHandleIntent(Intent intent) {
+    // Two important implementation notes:
+    //  1) If the intent contains extra data to open to a specific screen (e.g. DIAL intent), when
+    //     the user leaves that screen, they will return here and add see a blank screen unless we
+    //     select a tab here.
+    //  2) Don't return early here in case the intent does contain extra data.
     if (isShowTabIntent(intent)) {
       bottomNav.selectTab(getTabFromIntent(intent));
-      return;
+    } else if (lastTabController.isEnabled) {
+      lastTabController.selectLastTab();
+    } else {
+      bottomNav.selectTab(TabIndex.SPEED_DIAL);
     }
 
     if (isDialIntent(intent)) {
-      searchController.showDialpadFromNewIntent(false);
       // Dialpad will grab the intent and populate the number
-      return;
+      searchController.showDialpadFromNewIntent();
     }
-
-    if (lastTabController.isEnabled) {
-      lastTabController.selectLastTab();
-      return;
-    }
-
-    bottomNav.selectTab(TabIndex.SPEED_DIAL);
   }
 
   /** Returns true if the given intent contains a phone number to populate the dialer with */
@@ -296,6 +296,11 @@
   }
 
   @Override
+  public void onUserLeaveHint() {
+    searchController.onUserLeaveHint();
+  }
+
+  @Override
   public void onActivityStop() {
     lastTabController.onActivityStop();
     callLogFragmentListener.onActivityStop(
@@ -344,6 +349,7 @@
 
   @Override
   public boolean onBackPressed() {
+    LogUtil.enterBlock("OldMainActivityPeer.onBackPressed");
     if (searchController.onBackPressed()) {
       return true;
     }
@@ -460,6 +466,7 @@
     @Override
     public void onCallPlacedFromDialpad() {
       // TODO(calderwoodra): logging
+      searchController.onCallPlacedFromSearch();
     }
   }
 
@@ -480,6 +487,7 @@
     @Override
     public void onCallPlacedFromSearch() {
       // TODO(calderwoodra): logging
+      searchController.onCallPlacedFromSearch();
     }
   }
 
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
index a074b51..857c4b9 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.support.v7.app.AppCompatActivity;
 import android.view.MenuItem;
 
 /** Useful callback for {@link SearchBarView} listeners. */
@@ -36,6 +37,12 @@
   /** Called when a toolbar menu item is clicked. */
   boolean onMenuItemClicked(MenuItem menuItem);
 
+  /** Called when {@link AppCompatActivity#onUserLeaveHint()} is called. */
+  void onUserLeaveHint();
+
+  /** Called when the user places a call from search (regular or dialpad). */
+  void onCallPlacedFromSearch();
+
   /** Interface for returning voice results to the search bar. */
   interface VoiceSearchResultCallback {