Merge "Add assisted dialing to the new call log."
diff --git a/java/com/android/dialer/calllog/database/Coalescer.java b/java/com/android/dialer/calllog/database/Coalescer.java
index 71052b9..f4ef02a 100644
--- a/java/com/android/dialer/calllog/database/Coalescer.java
+++ b/java/com/android/dialer/calllog/database/Coalescer.java
@@ -29,6 +29,7 @@
 import com.android.dialer.calllog.datasources.DataSources;
 import com.android.dialer.calllogutils.PhoneAccountUtils;
 import com.android.dialer.common.Assert;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
 import com.google.common.base.Preconditions;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
@@ -171,10 +172,31 @@
       // An empty number should not be combined with any other number.
       return false;
     }
+
+    if (!meetsAssistedDialingCriteria(row1, row2)) {
+      return false;
+    }
     return dialerPhoneNumberUtil.isExactMatch(number1, number2);
   }
 
   /**
+   * Returns a boolean indicating whether or not FEATURES_ASSISTED_DIALING is mutually exclusive
+   * between two rows.
+   */
+  private static boolean meetsAssistedDialingCriteria(ContentValues row1, ContentValues row2) {
+    int row1Assisted =
+        row1.getAsInteger(AnnotatedCallLog.FEATURES)
+            & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING;
+    int row2Assisted =
+        row2.getAsInteger(AnnotatedCallLog.FEATURES)
+            & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING;
+
+    // FEATURES_ASSISTED_DIALING should not be combined with calls that are
+    // !FEATURES_ASSISTED_DIALING
+    return row1Assisted == row2Assisted;
+  }
+
+  /**
    * Delegates to data sources to aggregate individual columns to create a new coalesced row.
    *
    * @param individualRows {@link AnnotatedCallLog} rows sorted by timestamp descending
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 95fbf9d..5edc46a 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -199,6 +199,9 @@
         .useSingleValueString(AnnotatedCallLog.PHONE_ACCOUNT_LABEL)
         .useSingleValueLong(AnnotatedCallLog.PHONE_ACCOUNT_COLOR)
         .useMostRecentLong(AnnotatedCallLog.CALL_TYPE)
+        // If any call in a group includes a feature (like Wifi/HD), consider the group to have the
+        // feature.
+        .bitwiseOr(AnnotatedCallLog.FEATURES)
         .combine();
   }
 
diff --git a/java/com/android/dialer/calllog/datasources/util/RowCombiner.java b/java/com/android/dialer/calllog/datasources/util/RowCombiner.java
index 8e9e9c6..ebb1ba6 100644
--- a/java/com/android/dialer/calllog/datasources/util/RowCombiner.java
+++ b/java/com/android/dialer/calllog/datasources/util/RowCombiner.java
@@ -73,6 +73,16 @@
     return this;
   }
 
+  /** Performs a bitwise OR on the specified column and yields the result. */
+  public RowCombiner bitwiseOr(String columnName) {
+    int combinedValue = 0;
+    for (ContentValues val : individualRowsSortedByTimestampDesc) {
+      combinedValue |= val.getAsInteger(columnName);
+    }
+    combinedRow.put(columnName, combinedValue);
+    return this;
+  }
+
   public ContentValues combine() {
     return combinedRow;
   }
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
index 629a9a2..e45257f 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
@@ -30,6 +30,7 @@
 import com.android.dialer.calllogutils.CallLogEntryText;
 import com.android.dialer.calllogutils.CallLogIntents;
 import com.android.dialer.calllogutils.CallTypeIconsView;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.oem.MotorolaUtils;
@@ -114,11 +115,13 @@
   }
 
   private void setPrimaryCallTypes(CoalescedRow row) {
-    // Only HD and Wifi icons are shown following the primary text.
     primaryCallTypeIconsView.setShowHd(
         (row.features() & Calls.FEATURES_HD_CALL) == Calls.FEATURES_HD_CALL);
     primaryCallTypeIconsView.setShowWifi(
         MotorolaUtils.shouldShowWifiIconInCallLog(context, row.features()));
+    primaryCallTypeIconsView.setShowAssistedDialed(
+        (row.features() & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING)
+            == TelephonyManagerCompat.FEATURES_ASSISTED_DIALING);
   }
 
   private void setSecondaryCallTypes(CoalescedRow row) {