Merge changes Ibc853aa4,I061e3b45,I31983153
am: 96a2f8ec01

Change-Id: I5d81a2fb1b6c3fcdfadfa8eeb4b06b951534b68b
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 56e0a95..b96b127 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -136,6 +136,7 @@
 import com.android.dialer.util.TransactionSafeActivity;
 import com.android.dialer.util.ViewUtil;
 import com.android.dialer.widget.FloatingActionButtonController;
+import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -194,6 +195,8 @@
    */
   private static final long HISTORY_TAB_SEEN_TIMEOUT = TimeUnit.SECONDS.toMillis(3);
 
+  private static Optional<Boolean> sVoiceSearchEnabledForTest = Optional.absent();
+
   /** Fragment containing the dialpad that slides into view */
   protected DialpadFragment mDialpadFragment;
 
@@ -242,6 +245,7 @@
 
   private PopupMenu mOverflowMenu;
   private EditText mSearchView;
+  private SearchEditTextLayout mSearchEditTextLayout;
   private View mVoiceSearchButton;
   private String mSearchQuery;
   private String mDialpadQuery;
@@ -397,20 +401,19 @@
     actionBar.setDisplayShowCustomEnabled(true);
     actionBar.setBackgroundDrawable(null);
 
-    SearchEditTextLayout searchEditTextLayout =
-        actionBar.getCustomView().findViewById(R.id.search_view_container);
+    mSearchEditTextLayout = actionBar.getCustomView().findViewById(R.id.search_view_container);
 
-    mActionBarController = new ActionBarController(this, searchEditTextLayout);
+    mActionBarController = new ActionBarController(this, mSearchEditTextLayout);
 
-    mSearchView = searchEditTextLayout.findViewById(R.id.search_view);
+    mSearchView = mSearchEditTextLayout.findViewById(R.id.search_view);
     mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
     mSearchView.setHint(getSearchBoxHint());
 
-    mVoiceSearchButton = searchEditTextLayout.findViewById(R.id.voice_search_button);
-    searchEditTextLayout
+    mVoiceSearchButton = mSearchEditTextLayout.findViewById(R.id.voice_search_button);
+    mSearchEditTextLayout
         .findViewById(R.id.search_box_collapsed)
         .setOnClickListener(mSearchViewOnClickListener);
-    searchEditTextLayout
+    mSearchEditTextLayout
         .findViewById(R.id.search_back_button)
         .setOnClickListener(v -> exitSearchUi());
 
@@ -423,7 +426,7 @@
         new FloatingActionButtonController(this, floatingActionButton);
 
     ImageButton optionsMenuButton =
-        searchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button);
+        mSearchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button);
     optionsMenuButton.setOnClickListener(this);
     mOverflowMenu = buildOptionsMenu(optionsMenuButton);
     optionsMenuButton.setOnTouchListener(mOverflowMenu.getDragToOpenListener());
@@ -1015,13 +1018,15 @@
   }
 
   private void prepareVoiceSearchButton() {
-    final Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
-    if (canIntentBeHandled(voiceIntent)) {
-      mVoiceSearchButton.setVisibility(View.VISIBLE);
-      mVoiceSearchButton.setOnClickListener(this);
-    } else {
-      mVoiceSearchButton.setVisibility(View.GONE);
+    mSearchEditTextLayout.setVoiceSearchEnabled(isVoiceSearchEnabled());
+    mVoiceSearchButton.setOnClickListener(this);
+  }
+
+  private boolean isVoiceSearchEnabled() {
+    if (sVoiceSearchEnabledForTest.isPresent()) {
+      return sVoiceSearchEnabledForTest.get();
     }
+    return canIntentBeHandled(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH));
   }
 
   public boolean isNearbyPlacesSearchEnabled() {
@@ -1034,10 +1039,7 @@
 
   /** Sets the hint text for the contacts search box */
   private void setSearchBoxHint() {
-    SearchEditTextLayout searchEditTextLayout =
-        (SearchEditTextLayout)
-            getActionBarSafely().getCustomView().findViewById(R.id.search_view_container);
-    ((TextView) searchEditTextLayout.findViewById(R.id.search_box_start_search))
+    ((TextView) mSearchEditTextLayout.findViewById(R.id.search_box_start_search))
         .setHint(getSearchBoxHint());
   }
 
@@ -1714,4 +1716,9 @@
       return true;
     }
   }
+
+  @VisibleForTesting
+  static void setVoiceSearchEnabledForTest(Optional<Boolean> enabled) {
+    sVoiceSearchEnabledForTest = enabled;
+  }
 }
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
index 1836416..2fd9a21 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
@@ -27,6 +27,7 @@
 import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.app.NotificationCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
@@ -76,7 +77,7 @@
             .getResources()
             .getQuantityString(
                 R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size());
-    Notification.Builder groupSummary =
+    NotificationCompat.Builder groupSummary =
         createNotificationBuilder(context)
             .setContentTitle(contentTitle)
             .setContentText(callers)
@@ -127,8 +128,8 @@
     return NOTIFICATION_TAG_PREFIX + voicemailUri;
   }
 
-  private static Notification.Builder createNotificationBuilder(@NonNull Context context) {
-    return new Notification.Builder(context)
+  private static NotificationCompat.Builder createNotificationBuilder(@NonNull Context context) {
+    return new NotificationCompat.Builder(context)
         .setSmallIcon(android.R.drawable.stat_notify_voicemail)
         .setColor(context.getColor(R.color.dialer_theme_color))
         .setGroup(GROUP_KEY)
@@ -143,7 +144,7 @@
     PhoneAccountHandle handle = getAccountForCall(context, voicemail);
     ContactInfo contactInfo = contactInfos.get(voicemail.number);
 
-    Notification.Builder builder =
+    NotificationCompat.Builder builder =
         createNotificationBuilder(context)
             .setContentTitle(
                 ContactDisplayUtils.getTtsSpannedPhoneNumber(
@@ -157,7 +158,9 @@
     if (!TextUtils.isEmpty(voicemail.transcription)) {
       Logger.get(context)
           .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION);
-      builder.setContentText(voicemail.transcription);
+      builder
+          .setContentText(voicemail.transcription)
+          .setStyle(new NotificationCompat.BigTextStyle().bigText(voicemail.transcription));
     } else {
       switch (voicemail.transcriptionState) {
         case VoicemailCompat.TRANSCRIPTION_IN_PROGRESS:
diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
index 9da0e24..e7a707f 100644
--- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java
+++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
@@ -58,6 +58,8 @@
 
   private Callback mCallback;
 
+  private boolean mVoiceSearchEnabled;
+
   public SearchEditTextLayout(Context context, AttributeSet attrs) {
     super(context, attrs);
   }
@@ -70,6 +72,11 @@
     mCallback = listener;
   }
 
+  public void setVoiceSearchEnabled(boolean enabled) {
+    mVoiceSearchEnabled = enabled;
+    updateVisibility(mIsExpanded);
+  }
+
   @Override
   protected void onFinishInflate() {
     MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
@@ -272,7 +279,11 @@
 
     mSearchIcon.setVisibility(collapsedViewVisibility);
     mCollapsedSearchBox.setVisibility(collapsedViewVisibility);
-    mVoiceSearchButtonView.setVisibility(collapsedViewVisibility);
+    if (mVoiceSearchEnabled) {
+      mVoiceSearchButtonView.setVisibility(collapsedViewVisibility);
+    } else {
+      mVoiceSearchButtonView.setVisibility(View.GONE);
+    }
     mOverflowButtonView.setVisibility(collapsedViewVisibility);
     // TODO: Prevents keyboard from jumping up in landscape mode after exiting the
     // SearchFragment when the query string is empty. More elegant fix?
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
index f478d55..f2a1d09 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
@@ -39,6 +39,7 @@
         .addItem("Incoming call", () -> new SimulatorVoiceCall(context).addNewIncomingCall(false))
         .addItem("Outgoing call", () -> new SimulatorVoiceCall(context).addNewOutgoingCall())
         .addItem("Spam call", () -> new SimulatorVoiceCall(context).addNewIncomingCall(true))
+        .addItem("Emergency call", () -> new SimulatorVoiceCall(context).addNewEmergencyCall())
         .addItem(
             "GSM conference",
             () -> new SimulatorConferenceCreator(context, Simulator.CONFERENCE_TYPE_GSM).start(5));
@@ -64,6 +65,11 @@
         SimulatorSimCallManager.addNewOutgoingCall(context, callerId, false /* isVideo */);
   }
 
+  private void addNewEmergencyCall() {
+    String callerId = "911";
+    connectionTag = SimulatorSimCallManager.addNewIncomingCall(context, callerId, false);
+  }
+
   @Override
   public void onNewOutgoingConnection(@NonNull SimulatorConnection connection) {
     if (isMyConnection(connection)) {