Some small bug fixes in NUI.

 - Never show the dialpad chooser in MainActivity.
 - If the call log changed while dialer was in the background, it would trigger
 the content observer to fetch the new info, which would request it's parent
 that wasn't there. Now we register/unregister them in onResume/onPause. This
 is safe to do because we force refresh the data onResume anyways, so any
 changes will still be shown.

Bug: 73972084,73975555,73995512
Test: manual
PiperOrigin-RevId: 187407058
Change-Id: Iae86dabbcb852398bb2b9df4627e234261ab8030
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index b8fd571..37b241b 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -1454,6 +1454,12 @@
   }
 
   @Override
+  public boolean shouldShowDialpadChooser() {
+    // Show the dialpad chooser if we're in a call
+    return true;
+  }
+
+  @Override
   public void onSearchListTouch() {
     if (isDialpadShown) {
       PerformanceReport.recordClick(UiAction.Type.CLOSE_DIALPAD);
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 11c2499..7e49cc9 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -222,18 +222,6 @@
     final Activity activity = getActivity();
     final ContentResolver resolver = activity.getContentResolver();
     callLogQueryHandler = new CallLogQueryHandler(activity, resolver, this, logLimit);
-
-    if (PermissionsUtil.hasCallLogReadPermissions(getContext())) {
-      resolver.registerContentObserver(CallLog.CONTENT_URI, true, callLogObserver);
-    } else {
-      LogUtil.w("CallLogFragment.onCreate", "call log permission not available");
-    }
-    if (PermissionsUtil.hasContactsReadPermissions(getContext())) {
-      resolver.registerContentObserver(
-          ContactsContract.Contacts.CONTENT_URI, true, contactsObserver);
-    } else {
-      LogUtil.w("CallLogFragment.onCreate", "contacts permission not available.");
-    }
     setHasOptionsMenu(true);
   }
 
@@ -412,6 +400,19 @@
       updateEmptyMessage(callTypeFilter);
     }
 
+    ContentResolver resolver = getActivity().getContentResolver();
+    if (PermissionsUtil.hasCallLogReadPermissions(getContext())) {
+      resolver.registerContentObserver(CallLog.CONTENT_URI, true, callLogObserver);
+    } else {
+      LogUtil.w("CallLogFragment.onCreate", "call log permission not available");
+    }
+    if (PermissionsUtil.hasContactsReadPermissions(getContext())) {
+      resolver.registerContentObserver(
+          ContactsContract.Contacts.CONTENT_URI, true, contactsObserver);
+    } else {
+      LogUtil.w("CallLogFragment.onCreate", "contacts permission not available.");
+    }
+
     this.hasReadCallLogPermission = hasReadCallLogPermission;
 
     /*
@@ -432,6 +433,8 @@
   @Override
   public void onPause() {
     LogUtil.enterBlock("CallLogFragment.onPause");
+    getActivity().getContentResolver().unregisterContentObserver(callLogObserver);
+    getActivity().getContentResolver().unregisterContentObserver(contactsObserver);
     if (getUserVisibleHint()) {
       onNotVisible();
     }
@@ -465,9 +468,6 @@
     if (adapter != null) {
       adapter.changeCursor(null);
     }
-
-    getActivity().getContentResolver().unregisterContentObserver(callLogObserver);
-    getActivity().getContentResolver().unregisterContentObserver(contactsObserver);
     super.onDestroy();
   }
 
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 6801590..f093332 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -1312,7 +1312,9 @@
    *     or ringing or dialing, or on hold).
    */
   private boolean isPhoneInUse() {
-    return getContext() != null && TelecomUtil.isInManagedCall(getContext());
+    return getContext() != null
+        && TelecomUtil.isInManagedCall(getContext())
+        && FragmentUtils.getParentUnsafe(this, HostInterface.class).shouldShowDialpadChooser();
   }
 
   /** @return true if the phone is a CDMA phone type */
@@ -1584,6 +1586,9 @@
      * unless there happens to be content showing.
      */
     boolean onDialpadSpacerTouchWithEmptyQuery();
+
+    /** Returns true if this fragment's parent want the dialpad to show the dialpad chooser. */
+    boolean shouldShowDialpadChooser();
   }
 
   /**
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index 2999c6b..ee0dad5 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -651,6 +651,12 @@
       // No-op, just let the clicks fall through to the search list
       return false;
     }
+
+    @Override
+    public boolean shouldShowDialpadChooser() {
+      // Never show the dialpad chooser. Ever.
+      return false;
+    }
   }
 
   /** @see CallLogAdapter.OnActionModeStateChangedListener */
diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
index fc4bd03..2f36717 100644
--- a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
+++ b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
@@ -19,6 +19,7 @@
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.annotation.StringRes;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
@@ -66,9 +67,9 @@
     return listener.onMenuItemClicked(menuItem);
   }
 
-  public void setSearchBarListener(SearchBarListener listener) {
-    this.listener = listener;
-    ((SearchBarView) findViewById(R.id.search_view_container)).setSearchBarListener(listener);
+  public void setSearchBarListener(@NonNull SearchBarListener listener) {
+    this.listener = Assert.isNotNull(listener);
+    searchBar.setSearchBarListener(listener);
   }
 
   /** Slides the toolbar up and off the screen. */
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
index 78cabf7..2999850 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
@@ -32,6 +32,7 @@
 import android.widget.FrameLayout;
 import android.widget.TextView;
 import com.android.dialer.animation.AnimUtils;
+import com.android.dialer.common.Assert;
 import com.android.dialer.common.UiUtil;
 import com.android.dialer.util.DialerUtils;
 import com.google.common.base.Optional;
@@ -188,8 +189,8 @@
     requestLayout();
   }
 
-  /* package-private */ void setSearchBarListener(SearchBarListener listener) {
-    this.listener = listener;
+  /* package-private */ void setSearchBarListener(@NonNull SearchBarListener listener) {
+    this.listener = Assert.isNotNull(listener);
   }
 
   public String getQuery() {
@@ -236,7 +237,15 @@
         return;
       }
 
-      listener.onSearchQueryUpdated(s.toString());
+      // afterTextChanged is called each time the device is rotated (or the activity is recreated).
+      // That means that this method could potentially be called before the listener is set and
+      // we should check if it's null. In the case that it is null, assert that the query is empty
+      // because the listener must be notified of non-empty queries.
+      if (listener != null) {
+        listener.onSearchQueryUpdated(s.toString());
+      } else {
+        Assert.checkArgument(TextUtils.isEmpty(s.toString()));
+      }
     }
   }
 }