Merge changes I220a35f3,I2460308e,I15b52595,I4ba40e53

* changes:
  Use type TEXT instead of STRING for annotated call log columns.
  Stop turning on the screen when the incoming/outgoing call is via Bluetooth.
  Filter out contacts with null primary display names in search.
  Conferece call management screen UI adjustment.
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
index 9fd5bd9..3062710 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
@@ -38,26 +38,26 @@
           + " ("
           + (AnnotatedCallLog._ID + " integer primary key, ")
           + (AnnotatedCallLog.TIMESTAMP + " integer, ")
-          + (AnnotatedCallLog.NAME + " string, ")
+          + (AnnotatedCallLog.NAME + " text, ")
           + (AnnotatedCallLog.NUMBER + " blob, ")
-          + (AnnotatedCallLog.FORMATTED_NUMBER + " string, ")
-          + (AnnotatedCallLog.PHOTO_URI + " string, ")
+          + (AnnotatedCallLog.FORMATTED_NUMBER + " text, ")
+          + (AnnotatedCallLog.PHOTO_URI + " text, ")
           + (AnnotatedCallLog.PHOTO_ID + " integer, ")
-          + (AnnotatedCallLog.LOOKUP_URI + " string, ")
+          + (AnnotatedCallLog.LOOKUP_URI + " text, ")
           + (AnnotatedCallLog.DURATION + " integer, ")
-          + (AnnotatedCallLog.NUMBER_TYPE_LABEL + " string, ")
+          + (AnnotatedCallLog.NUMBER_TYPE_LABEL + " text, ")
           + (AnnotatedCallLog.IS_READ + " integer, ")
           + (AnnotatedCallLog.NEW + " integer, ")
-          + (AnnotatedCallLog.GEOCODED_LOCATION + " string, ")
-          + (AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME + " string, ")
-          + (AnnotatedCallLog.PHONE_ACCOUNT_ID + " string, ")
-          + (AnnotatedCallLog.PHONE_ACCOUNT_LABEL + " string, ")
+          + (AnnotatedCallLog.GEOCODED_LOCATION + " text, ")
+          + (AnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME + " text, ")
+          + (AnnotatedCallLog.PHONE_ACCOUNT_ID + " text, ")
+          + (AnnotatedCallLog.PHONE_ACCOUNT_LABEL + " text, ")
           + (AnnotatedCallLog.PHONE_ACCOUNT_COLOR + " integer, ")
           + (AnnotatedCallLog.FEATURES + " integer, ")
           + (AnnotatedCallLog.IS_BUSINESS + " integer, ")
           + (AnnotatedCallLog.IS_VOICEMAIL + " integer, ")
           + (AnnotatedCallLog.TRANSCRIPTION + " integer, ")
-          + (AnnotatedCallLog.VOICEMAIL_URI + " string, ")
+          + (AnnotatedCallLog.VOICEMAIL_URI + " text, ")
           + (AnnotatedCallLog.CALL_TYPE + " integer")
           + ");";
 
diff --git a/java/com/android/dialer/calllogutils/CallTypeIconsView.java b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
index bf33faa..0c28a97 100644
--- a/java/com/android/dialer/calllogutils/CallTypeIconsView.java
+++ b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
@@ -268,7 +268,7 @@
       iconId = R.drawable.quantum_ic_voicemail_white_24;
       drawable = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
       voicemail = drawable.mutate();
-      voicemail.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
+      voicemail.setColorFilter(r.getColor(R.color.icon_color_grey), PorterDuff.Mode.MULTIPLY);
 
       iconId = R.drawable.quantum_ic_block_white_24;
       drawable = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
@@ -278,17 +278,17 @@
       iconId = R.drawable.quantum_ic_videocam_white_24;
       drawable = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
       videoCall = drawable.mutate();
-      videoCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
+      videoCall.setColorFilter(r.getColor(R.color.icon_color_grey), PorterDuff.Mode.MULTIPLY);
 
       iconId = R.drawable.quantum_ic_hd_white_24;
       drawable = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
       hdCall = drawable.mutate();
-      hdCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
+      hdCall.setColorFilter(r.getColor(R.color.icon_color_grey), PorterDuff.Mode.MULTIPLY);
 
       iconId = R.drawable.quantum_ic_signal_wifi_4_bar_white_24;
       drawable = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
       wifiCall = drawable.mutate();
-      wifiCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
+      wifiCall.setColorFilter(r.getColor(R.color.icon_color_grey), PorterDuff.Mode.MULTIPLY);
 
       iconMargin = largeIcons ? 0 : r.getDimensionPixelSize(R.dimen.call_log_icon_margin);
     }
diff --git a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
index df67b76..166902b 100644
--- a/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
+++ b/java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java
@@ -132,8 +132,8 @@
   }
 
   private static List<Cp2Contact> coalesceContacts(List<Cp2Contact> contactsWithSameContactId) {
-    String companyName = null;
-    String nickName = null;
+    StringBuilder companyName = new StringBuilder();
+    StringBuilder nickName = new StringBuilder();
     List<Cp2Contact> phoneContacts = new ArrayList<>();
     for (Cp2Contact contact : contactsWithSameContactId) {
       if (contact.mimeType().equals(Phone.CONTENT_ITEM_TYPE)) {
@@ -141,11 +141,11 @@
       } else if (contact.mimeType().equals(Organization.CONTENT_ITEM_TYPE)) {
         // Since a contact can have more than one company name but they aren't visible to the user
         // in our search UI, we can lazily concatenate them together to make them all searchable.
-        companyName += " " + contact.companyName();
+        companyName.append(" ").append(contact.companyName());
       } else if (contact.mimeType().equals(Nickname.CONTENT_ITEM_TYPE)) {
         // Since a contact can have more than one nickname but they aren't visible to the user
         // in our search UI, we can lazily concatenate them together to make them all searchable.
-        nickName += " " + contact.nickName();
+        nickName.append(" ").append(contact.nickName());
       }
     }
 
@@ -154,7 +154,11 @@
     List<Cp2Contact> coalescedContacts = new ArrayList<>();
     for (Cp2Contact phoneContact : phoneContacts) {
       coalescedContacts.add(
-          phoneContact.toBuilder().setCompanyName(companyName).setNickName(nickName).build());
+          phoneContact
+              .toBuilder()
+              .setCompanyName(companyName.length() == 0 ? null : companyName.toString())
+              .setNickName(nickName.length() == 0 ? null : nickName.toString())
+              .build());
     }
     return coalescedContacts;
   }
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
index 3551801..2b7af11 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
@@ -43,9 +43,20 @@
     this.query = query;
   }
 
+  /**
+   * Note: ContactsProvider can make no guarantee that any given field is non-null, and display name
+   * has been observed to be null in the wild, though it is unclear when that might happen (possibly
+   * a third-party is inserting such data). See a bug.
+   *
+   * <p>We skip showing contacts without a display name because there is no UI treatment for showing
+   * such results. (Note that even contacts with only a number still have a display name set to the
+   * number.)
+   */
   private static String whereStatement() {
     return (Phone.NUMBER + " IS NOT NULL")
         + " AND "
+        + (Data.DISPLAY_NAME_PRIMARY + " IS NOT NULL")
+        + " AND "
         + Data.MIMETYPE
         + " IN (\'"
         + Phone.CONTENT_ITEM_TYPE
diff --git a/java/com/android/dialer/theme/res/values/colors.xml b/java/com/android/dialer/theme/res/values/colors.xml
index f44a7cc..a59fa67 100644
--- a/java/com/android/dialer/theme/res/values/colors.xml
+++ b/java/com/android/dialer/theme/res/values/colors.xml
@@ -68,8 +68,8 @@
 
   <color name="blue_grey_100">#CFD8DC</color>
 
-  <!-- Color of call type icons in call log, e.g. voicemail, video, WiFi, HD etc. -->
-  <color name="call_type_icon_color">#89000000</color>
+  <!-- 54% opacity -->
+  <color name="icon_color_grey">#89000000</color>
 
   <!-- Color for bubble -->
   <color name="dialer_end_call_button_color">#FFDF0000</color>
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index d0f4885..66b6a97 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -242,7 +242,6 @@
         contactCache.namePrimary,
         call.updateNameIfRestricted(name),
         contactCache.number,
-        contactCache.label,
         contactCache.lookupKey,
         contactCache.displayPhotoUri,
         thisRowCanSeparate,
@@ -277,7 +276,6 @@
    * @param view The view to set the details on.
    * @param callerName The participant's name.
    * @param callerNumber The participant's phone number.
-   * @param callerNumberType The participant's phone number typ.e
    * @param lookupKey The lookup key for the participant (for photo lookup).
    * @param photoUri The URI of the contact photo.
    * @param thisRowCanSeparate {@code True} if this participant can separate from the conference.
@@ -288,7 +286,6 @@
       String callerName,
       String preferredName,
       String callerNumber,
-      String callerNumberType,
       String lookupKey,
       Uri photoUri,
       boolean thisRowCanSeparate,
@@ -299,16 +296,13 @@
     final TextView statusTextView = (TextView) view.findViewById(R.id.conferenceCallerStatus);
     final TextView nameTextView = (TextView) view.findViewById(R.id.conferenceCallerName);
     final TextView numberTextView = (TextView) view.findViewById(R.id.conferenceCallerNumber);
-    final TextView numberTypeTextView =
-        (TextView) view.findViewById(R.id.conferenceCallerNumberType);
     final View endButton = view.findViewById(R.id.conferenceCallerDisconnect);
     final View separateButton = view.findViewById(R.id.conferenceCallerSeparate);
 
     if (callState == DialerCall.State.ONHOLD) {
-      setViewsOnHold(photoView, statusTextView, nameTextView, numberTextView, numberTypeTextView);
+      setViewsOnHold(photoView, statusTextView, nameTextView, numberTextView);
     } else {
-      setViewsNotOnHold(
-          photoView, statusTextView, nameTextView, numberTextView, numberTypeTextView);
+      setViewsNotOnHold(photoView, statusTextView, nameTextView, numberTextView);
     }
 
     endButton.setVisibility(thisRowCanDisconnect ? View.VISIBLE : View.GONE);
@@ -325,27 +319,30 @@
       separateButton.setOnClickListener(null);
     }
 
+    String displayNameForImage = TextUtils.isEmpty(callerName) ? callerNumber : callerName;
     DefaultImageRequest imageRequest =
         (photoUri != null)
             ? null
-            : new DefaultImageRequest(callerName, lookupKey, true /* isCircularPhoto */);
+            : new DefaultImageRequest(displayNameForImage, lookupKey, true /* isCircularPhoto */);
 
     mContactPhotoManager.loadDirectoryPhoto(photoView, photoUri, false, true, imageRequest);
 
     // set the caller name
-    nameTextView.setText(preferredName);
+    if (TextUtils.isEmpty(preferredName)) {
+      nameTextView.setVisibility(View.GONE);
+    } else {
+      nameTextView.setVisibility(View.VISIBLE);
+      nameTextView.setText(preferredName);
+    }
 
     // set the caller number in subscript, or make the field disappear.
     if (TextUtils.isEmpty(callerNumber)) {
       numberTextView.setVisibility(View.GONE);
-      numberTypeTextView.setVisibility(View.GONE);
     } else {
       numberTextView.setVisibility(View.VISIBLE);
       numberTextView.setText(
           PhoneNumberUtilsCompat.createTtsSpannable(
               BidiFormatter.getInstance().unicodeWrap(callerNumber, TextDirectionHeuristics.LTR)));
-      numberTypeTextView.setVisibility(View.VISIBLE);
-      numberTypeTextView.setText(callerNumberType);
     }
   }
 
@@ -353,8 +350,7 @@
       ImageView photoView,
       TextView statusTextView,
       TextView nameTextView,
-      TextView numberTextView,
-      TextView numberTypeTextView) {
+      TextView numberTextView) {
     CharSequence onHoldText =
         TextUtils.concat(getContext().getText(R.string.notification_on_hold).toString(), " • ");
     statusTextView.setText(onHoldText);
@@ -363,7 +359,6 @@
     int onHoldColor = getContext().getColor(R.color.dialer_secondary_text_color_hiden);
     nameTextView.setTextColor(onHoldColor);
     numberTextView.setTextColor(onHoldColor);
-    numberTypeTextView.setTextColor(onHoldColor);
 
     TypedValue alpha = new TypedValue();
     getContext().getResources().getValue(R.dimen.alpha_hiden, alpha, true);
@@ -374,16 +369,13 @@
       ImageView photoView,
       TextView statusTextView,
       TextView nameTextView,
-      TextView numberTextView,
-      TextView numberTypeTextView) {
+      TextView numberTextView) {
     statusTextView.setVisibility(View.GONE);
 
     nameTextView.setTextColor(
         getContext().getColor(R.color.conference_call_manager_caller_name_text_color));
     numberTextView.setTextColor(
         getContext().getColor(R.color.conference_call_manager_secondary_text_color));
-    numberTypeTextView.setTextColor(
-        getContext().getColor(R.color.conference_call_manager_secondary_text_color));
 
     TypedValue alpha = new TypedValue();
     getContext().getResources().getValue(R.dimen.alpha_enabled, alpha, true);
diff --git a/java/com/android/incallui/InCallActivityCommon.java b/java/com/android/incallui/InCallActivityCommon.java
index a9702b4..5a5d770 100644
--- a/java/com/android/incallui/InCallActivityCommon.java
+++ b/java/com/android/incallui/InCallActivityCommon.java
@@ -33,10 +33,12 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.content.res.ResourcesCompat;
+import android.telecom.CallAudioState;
 import android.telecom.PhoneAccountHandle;
 import android.view.KeyEvent;
 import android.view.View;
@@ -65,6 +67,7 @@
 import com.android.incallui.incalluilock.InCallUiLock;
 import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogFragment;
 import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogFragment.Callback;
+import com.google.common.base.Optional;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -96,6 +99,8 @@
   private static final int DIALPAD_REQUEST_SHOW = 2;
   private static final int DIALPAD_REQUEST_HIDE = 3;
 
+  private static Optional<Integer> audioRouteForTesting = Optional.absent();
+
   private final InCallActivity inCallActivity;
   private boolean dismissKeyguard;
   private boolean showPostCharWaitDialogOnResume;
@@ -171,14 +176,7 @@
   }
 
   public void onCreate(Bundle icicle) {
-    // set this flag so this activity will stay in front of the keyguard
-    // Have the WindowManager filter out touch events that are "too fat".
-    int flags =
-        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
-            | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
-
-    inCallActivity.getWindow().addFlags(flags);
+    setWindowFlags();
 
     inCallActivity.setContentView(R.layout.incall_screen);
 
@@ -483,6 +481,36 @@
     return event.getRepeatCount() == 0 && handleDialerKeyDown(keyCode, event);
   }
 
+  private void setWindowFlags() {
+    // Allow the activity to be shown when the screen is locked and filter out touch events that are
+    // "too fat".
+    int flags =
+        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+            | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
+
+    // When the audio stream is not directed through Bluetooth, turn the screen on once the
+    // activity is shown.
+    final int audioRoute = getAudioRoute();
+    if (audioRoute != CallAudioState.ROUTE_BLUETOOTH) {
+      flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+    }
+
+    inCallActivity.getWindow().addFlags(flags);
+  }
+
+  private static int getAudioRoute() {
+    if (audioRouteForTesting.isPresent()) {
+      return audioRouteForTesting.get();
+    }
+
+    return AudioModeProvider.getInstance().getAudioState().getRoute();
+  }
+
+  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+  public static void setAudioRouteForTesting(int audioRoute) {
+    audioRouteForTesting = Optional.of(audioRoute);
+  }
+
   private boolean handleDialerKeyDown(int keyCode, KeyEvent event) {
     LogUtil.v("InCallActivityCommon.handleDialerKeyDown", "keyCode %d, event: %s", keyCode, event);
 
diff --git a/java/com/android/incallui/res/layout/caller_in_conference.xml b/java/com/android/incallui/res/layout/caller_in_conference.xml
index 3791818..be4eca5 100644
--- a/java/com/android/incallui/res/layout/caller_in_conference.xml
+++ b/java/com/android/incallui/res/layout/caller_in_conference.xml
@@ -82,18 +82,6 @@
           android:textColor="@color/conference_call_manager_secondary_text_color"
           android:textSize="14sp"/>
 
-        <!-- Number type -->
-        <TextView
-          android:id="@+id/conferenceCallerNumberType"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:ellipsize="marquee"
-          android:gravity="start"
-          android:singleLine="true"
-          android:textAllCaps="true"
-          android:textColor="@color/conference_call_manager_secondary_text_color"
-          android:textSize="12sp"/>
-
       </LinearLayout>  <!-- End of caller number -->
 
     </LinearLayout>  <!-- End of caller information -->
@@ -110,7 +98,7 @@
     android:contentDescription="@string/goPrivate"
     android:scaleType="center"
     android:src="@drawable/ic_call_split_white_24dp"
-    android:tint="@color/conference_call_manager_icon_color"/>
+    android:tint="@color/icon_color_grey"/>
 
   <!-- "Disconnect" button which terminates the connection with this caller. -->
   <ImageButton
@@ -123,6 +111,6 @@
     android:contentDescription="@string/conference_caller_disconnect_content_description"
     android:scaleType="center"
     android:src="@drawable/quantum_ic_call_end_white_24"
-    android:tint="@color/conference_call_manager_icon_color"/>
+    android:tint="@color/icon_color_grey"/>
 
 </LinearLayout>  <!-- End of single list element -->
diff --git a/java/com/android/incallui/res/values/colors.xml b/java/com/android/incallui/res/values/colors.xml
index 4bded78..32da57b 100644
--- a/java/com/android/incallui/res/values/colors.xml
+++ b/java/com/android/incallui/res/values/colors.xml
@@ -17,7 +17,6 @@
 
 <resources>
   <color name="conference_call_manager_caller_name_text_color">#4d4d4d</color>
-  <color name="conference_call_manager_icon_color">#999999</color>
   <!-- Used with some smaller texts in manage conference screen. -->
   <color name="conference_call_manager_secondary_text_color">#999999</color>
 
@@ -34,7 +33,6 @@
 
       These colors are also used by InCallUIMaterialColorMapUtils to generate
       primary activity colors.
-
   -->
   <array name="background_colors">
     <item>#00796B</item>