Convert @AutoValue CoalescedRow to a proto

Test: Existing tests
PiperOrigin-RevId: 189675976
Change-Id: Ieae92b5ac2aefd3f0397bbb07ebb1c97bd72ed42
diff --git a/java/com/android/dialer/calllog/model/CoalescedRow.java b/java/com/android/dialer/calllog/model/CoalescedRow.java
deleted file mode 100644
index 737e736..0000000
--- a/java/com/android/dialer/calllog/model/CoalescedRow.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.calllog.model;
-
-import android.support.annotation.ColorInt;
-import android.support.annotation.Nullable;
-import com.android.dialer.CoalescedIds;
-import com.android.dialer.DialerPhoneNumber;
-import com.android.dialer.NumberAttributes;
-import com.google.auto.value.AutoValue;
-
-/** Data class containing the contents of a row from the CoalescedAnnotatedCallLog. */
-@AutoValue
-public abstract class CoalescedRow {
-
-  public static Builder builder() {
-    return new AutoValue_CoalescedRow.Builder()
-        .setId(0)
-        .setTimestamp(0)
-        .setNumber(DialerPhoneNumber.getDefaultInstance())
-        .setNumberPresentation(0)
-        .setIsRead(false)
-        .setIsNew(false)
-        .setPhoneAccountColor(0)
-        .setFeatures(0)
-        .setCallType(0)
-        .setNumberAttributes(NumberAttributes.getDefaultInstance())
-        .setIsVoicemailCall(false)
-        .setCoalescedIds(CoalescedIds.getDefaultInstance());
-  }
-
-  public abstract Builder toBuilder();
-
-  public abstract int id();
-
-  public abstract long timestamp();
-
-  public abstract DialerPhoneNumber number();
-
-  @Nullable
-  public abstract String formattedNumber();
-
-  public abstract int numberPresentation();
-
-  public abstract boolean isRead();
-
-  public abstract boolean isNew();
-
-  @Nullable
-  public abstract String geocodedLocation();
-
-  @Nullable
-  public abstract String phoneAccountComponentName();
-
-  @Nullable
-  public abstract String phoneAccountId();
-
-  @Nullable
-  public abstract String phoneAccountLabel();
-
-  @ColorInt
-  public abstract int phoneAccountColor();
-
-  public abstract int features();
-
-  public abstract int callType();
-
-  public abstract NumberAttributes numberAttributes();
-
-  public abstract boolean isVoicemailCall();
-
-  @Nullable
-  public abstract String voicemailCallTag();
-
-  public abstract CoalescedIds coalescedIds();
-
-  /** Builder for {@link CoalescedRow}. */
-  @AutoValue.Builder
-  public abstract static class Builder {
-
-    public abstract Builder setId(int id);
-
-    public abstract Builder setTimestamp(long timestamp);
-
-    public abstract Builder setNumber(DialerPhoneNumber number);
-
-    public abstract Builder setFormattedNumber(@Nullable String formattedNumber);
-
-    public abstract Builder setNumberPresentation(int presentation);
-
-    public abstract Builder setIsRead(boolean isRead);
-
-    public abstract Builder setIsNew(boolean isNew);
-
-    public abstract Builder setGeocodedLocation(@Nullable String geocodedLocation);
-
-    public abstract Builder setPhoneAccountComponentName(
-        @Nullable String phoneAccountComponentName);
-
-    public abstract Builder setPhoneAccountId(@Nullable String phoneAccountId);
-
-    public abstract Builder setPhoneAccountLabel(@Nullable String phoneAccountLabel);
-
-    public abstract Builder setPhoneAccountColor(@ColorInt int phoneAccountColor);
-
-    public abstract Builder setFeatures(int features);
-
-    public abstract Builder setCallType(int callType);
-
-    public abstract Builder setNumberAttributes(NumberAttributes numberAttributes);
-
-    public abstract Builder setIsVoicemailCall(boolean isVoicemail);
-
-    public abstract Builder setVoicemailCallTag(@Nullable String tag);
-
-    public abstract Builder setCoalescedIds(CoalescedIds coalescedIds);
-
-    public abstract CoalescedRow build();
-  }
-}
diff --git a/java/com/android/dialer/calllog/model/coalesced_row.proto b/java/com/android/dialer/calllog/model/coalesced_row.proto
new file mode 100644
index 0000000..3cb10e7
--- /dev/null
+++ b/java/com/android/dialer/calllog/model/coalesced_row.proto
@@ -0,0 +1,70 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.calllog.model";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+
+package com.android.dialer.calllog.model;
+
+import "java/com/android/dialer/calllog/database/contract/coalesced_ids.proto";
+import "java/com/android/dialer/calllog/database/contract/number_attributes.proto";
+import "java/com/android/dialer/phonenumberproto/dialer_phone_number.proto";
+
+// Contains the contents of a row from the CoalescedAnnotatedCallLog.
+// Next ID: 19
+message CoalescedRow {
+  // Value in column CoalescedAnnotatedCallLog._ID
+  optional int64 id = 1;
+
+  // Value in column CoalescedAnnotatedCallLog.TIMESTAMP
+  optional int64 timestamp = 2;
+
+  // Value in column CoalescedAnnotatedCallLog.NUMBER
+  optional com.android.dialer.DialerPhoneNumber number = 3;
+
+  // Value in column CoalescedAnnotatedCallLog.FORMATTED_NUMBER
+  optional string formatted_number = 4;
+
+  // Value in column CoalescedAnnotatedCallLog.NUMBER_PRESENTATION
+  optional int32 number_presentation = 5;
+
+  // Value in column CoalescedAnnotatedCallLog.IS_READ
+  optional bool is_read = 6;
+
+  // Value in column CoalescedAnnotatedCallLog.NEW
+  optional bool is_new = 7;
+
+  // Value in column CoalescedAnnotatedCallLog.GEOCODED_LOCATION
+  optional string geocoded_location = 8;
+
+  // Value in column CoalescedAnnotatedCallLog.PHONE_ACCOUNT_COMPONENT_NAME
+  optional string phone_account_component_name = 9;
+
+  // Value in column CoalescedAnnotatedCallLog.PHONE_ACCOUNT_ID
+  optional string phone_account_id = 10;
+
+  // Value in column CoalescedAnnotatedCallLog.PHONE_ACCOUNT_LABEL
+  optional string phone_account_label = 11;
+
+  // Value in column CoalescedAnnotatedCallLog.PHONE_ACCOUNT_COLOR
+  optional int32 phone_account_color = 12;
+
+  // Value in column CoalescedAnnotatedCallLog.FEATURES
+  optional int32 features = 13;
+
+  // Value in column CoalescedAnnotatedCallLog.CALL_TYPE
+  optional int32 call_type = 14;
+
+  // Value in column CoalescedAnnotatedCallLog.NUMBER_ATTRIBUTES
+  optional com.android.dialer.NumberAttributes number_attributes = 15;
+
+  // Value in column CoalescedAnnotatedCallLog.IS_VOICEMAIL_CALL
+  optional bool is_voicemail_call = 16;
+
+  // Value in column CoalescedAnnotatedCallLog.VOICEMAIL_CALL_TAG
+  optional string voicemail_call_tag = 17;
+
+  // Value in column CoalescedAnnotatedCallLog.COALESCED_IDS
+  optional com.android.dialer.CoalescedIds coalesced_ids = 18;
+}
diff --git a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java
index a5cfd3f..e2ddcc8 100644
--- a/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java
+++ b/java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.support.v4.content.CursorLoader;
+import android.text.TextUtils;
 import com.android.dialer.CoalescedIds;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.NumberAttributes;
@@ -84,26 +85,53 @@
       throw new IllegalStateException("Couldn't parse NumberAttributes bytes");
     }
 
-    return CoalescedRow.builder()
-        .setId(cursor.getInt(ID))
-        .setTimestamp(cursor.getLong(TIMESTAMP))
-        .setNumber(number)
-        .setFormattedNumber(cursor.getString(FORMATTED_NUMBER))
-        .setNumberPresentation(cursor.getInt(NUMBER_PRESENTATION))
-        .setIsRead(cursor.getInt(IS_READ) == 1)
-        .setIsNew(cursor.getInt(NEW) == 1)
-        .setGeocodedLocation(cursor.getString(GEOCODED_LOCATION))
-        .setPhoneAccountComponentName(cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME))
-        .setPhoneAccountId(cursor.getString(PHONE_ACCOUNT_ID))
-        .setPhoneAccountLabel(cursor.getString(PHONE_ACCOUNT_LABEL))
-        .setPhoneAccountColor(cursor.getInt(PHONE_ACCOUNT_COLOR))
-        .setFeatures(cursor.getInt(FEATURES))
-        .setCallType(cursor.getInt(CALL_TYPE))
-        .setNumberAttributes(numberAttributes)
-        .setIsVoicemailCall(cursor.getInt(IS_VOICEMAIL_CALL) == 1)
-        .setVoicemailCallTag(cursor.getString(VOICEMAIL_CALL_TAG))
-        .setCoalescedIds(coalescedIds)
-        .build();
+    CoalescedRow.Builder coalescedRowBuilder =
+        CoalescedRow.newBuilder()
+            .setId(cursor.getLong(ID))
+            .setTimestamp(cursor.getLong(TIMESTAMP))
+            .setNumber(number)
+            .setNumberPresentation(cursor.getInt(NUMBER_PRESENTATION))
+            .setIsRead(cursor.getInt(IS_READ) == 1)
+            .setIsNew(cursor.getInt(NEW) == 1)
+            .setPhoneAccountColor(cursor.getInt(PHONE_ACCOUNT_COLOR))
+            .setFeatures(cursor.getInt(FEATURES))
+            .setCallType(cursor.getInt(CALL_TYPE))
+            .setNumberAttributes(numberAttributes)
+            .setIsVoicemailCall(cursor.getInt(IS_VOICEMAIL_CALL) == 1)
+            .setCoalescedIds(coalescedIds);
+
+    String formattedNumber = cursor.getString(FORMATTED_NUMBER);
+    if (!TextUtils.isEmpty(formattedNumber)) {
+      coalescedRowBuilder.setFormattedNumber(formattedNumber);
+    }
+
+    String geocodedLocation = cursor.getString(GEOCODED_LOCATION);
+    if (!TextUtils.isEmpty(geocodedLocation)) {
+      coalescedRowBuilder.setGeocodedLocation(geocodedLocation);
+    }
+
+    String phoneAccountComponentName = cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME);
+    if (!TextUtils.isEmpty(phoneAccountComponentName)) {
+      coalescedRowBuilder.setPhoneAccountComponentName(
+          cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME));
+    }
+
+    String phoneAccountId = cursor.getString(PHONE_ACCOUNT_ID);
+    if (!TextUtils.isEmpty(phoneAccountId)) {
+      coalescedRowBuilder.setPhoneAccountId(phoneAccountId);
+    }
+
+    String phoneAccountLabel = cursor.getString(PHONE_ACCOUNT_LABEL);
+    if (!TextUtils.isEmpty(phoneAccountLabel)) {
+      coalescedRowBuilder.setPhoneAccountLabel(phoneAccountLabel);
+    }
+
+    String voicemailCallTag = cursor.getString(VOICEMAIL_CALL_TAG);
+    if (!TextUtils.isEmpty(voicemailCallTag)) {
+      coalescedRowBuilder.setVoicemailCallTag(voicemailCallTag);
+    }
+
+    return coalescedRowBuilder.build();
   }
 
   static long getTimestamp(Cursor cursor) {
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
index 74be21b..713ca44 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
@@ -36,7 +36,6 @@
 import com.android.dialer.compat.AppCompatConstants;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.glidephotomanager.GlidePhotoManager;
-import com.android.dialer.glidephotomanager.PhotoInfo;
 import com.android.dialer.oem.MotorolaUtils;
 import com.android.dialer.time.Clock;
 import com.google.common.util.concurrent.FutureCallback;
@@ -65,7 +64,7 @@
 
   private final GlidePhotoManager glidePhotoManager;
 
-  private int currentRowId;
+  private long currentRowId;
 
   NewCallLogViewHolder(
       View view,
@@ -94,7 +93,7 @@
   /** @param cursor a cursor from {@link CoalescedAnnotatedCallLogCursorLoader}. */
   void bind(Cursor cursor) {
     CoalescedRow row = CoalescedAnnotatedCallLogCursorLoader.toRow(cursor);
-    currentRowId = row.id(); // Used to make sure async updates are applied to the correct views
+    currentRowId = row.getId(); // Used to make sure async updates are applied to the correct views
 
     // Even if there is additional real time processing necessary, we still want to immediately show
     // what information we have, rather than an empty card. For example, if CP2 information needs to
@@ -136,7 +135,7 @@
   }
 
   private void setNumberCalls(CoalescedRow row) {
-    int numberCalls = row.coalescedIds().getCoalescedIdCount();
+    int numberCalls = row.getCoalescedIds().getCoalescedIdCount();
     if (numberCalls > 1) {
       callCountTextView.setText(String.format(Locale.getDefault(), "(%d)", numberCalls));
       callCountTextView.setVisibility(View.VISIBLE);
@@ -148,18 +147,16 @@
   private boolean isNewMissedCall(CoalescedRow row) {
     // Show missed call styling if the most recent call in the group was missed and it is still
     // marked as NEW. It is not clear what IS_READ should be used for and it is currently not used.
-    return row.callType() == Calls.MISSED_TYPE && row.isNew();
+    return row.getCallType() == Calls.MISSED_TYPE && row.getIsNew();
   }
 
   private void setPhoto(CoalescedRow row) {
-    PhotoInfo.Builder photoInfoBuilder =
-        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
-            .setIsVoicemail(row.isVoicemailCall());
-    if (!TextUtils.isEmpty(row.formattedNumber())) {
-      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
-    }
-
-    glidePhotoManager.loadQuickContactBadge(quickContactBadge, photoInfoBuilder.build());
+    glidePhotoManager.loadQuickContactBadge(
+        quickContactBadge,
+        NumberAttributesConverter.toPhotoInfoBuilder(row.getNumberAttributes())
+            .setFormattedNumber(row.getFormattedNumber())
+            .setIsVoicemail(row.getIsVoicemailCall())
+            .build());
   }
 
   private void setFeatureIcons(CoalescedRow row) {
@@ -171,7 +168,7 @@
                     : R.color.feature_icon_read_color));
 
     // Handle HD Icon
-    if ((row.features() & Calls.FEATURES_HD_CALL) == Calls.FEATURES_HD_CALL) {
+    if ((row.getFeatures() & Calls.FEATURES_HD_CALL) == Calls.FEATURES_HD_CALL) {
       hdIcon.setVisibility(View.VISIBLE);
       hdIcon.setImageTintList(colorStateList);
     } else {
@@ -179,7 +176,7 @@
     }
 
     // Handle Wifi Icon
-    if (MotorolaUtils.shouldShowWifiIconInCallLog(context, row.features())) {
+    if (MotorolaUtils.shouldShowWifiIconInCallLog(context, row.getFeatures())) {
       wifiIcon.setVisibility(View.VISIBLE);
       wifiIcon.setImageTintList(colorStateList);
     } else {
@@ -187,7 +184,7 @@
     }
 
     // Handle Assisted Dialing Icon
-    if ((row.features() & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING)
+    if ((row.getFeatures() & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING)
         == TelephonyManagerCompat.FEATURES_ASSISTED_DIALING) {
       assistedDialIcon.setVisibility(View.VISIBLE);
       assistedDialIcon.setImageTintList(colorStateList);
@@ -198,7 +195,7 @@
 
   private void setCallTypeIcon(CoalescedRow row) {
     @DrawableRes int resId;
-    switch (row.callType()) {
+    switch (row.getCallType()) {
       case AppCompatConstants.CALLS_INCOMING_TYPE:
       case AppCompatConstants.CALLS_ANSWERED_EXTERNALLY_TYPE:
         resId = R.drawable.quantum_ic_call_received_vd_theme_24;
@@ -234,9 +231,9 @@
   }
 
   private void setPhoneAccounts(CoalescedRow row) {
-    if (row.phoneAccountLabel() != null) {
-      phoneAccountView.setText(row.phoneAccountLabel());
-      phoneAccountView.setTextColor(row.phoneAccountColor());
+    if (!TextUtils.isEmpty(row.getPhoneAccountLabel())) {
+      phoneAccountView.setText(row.getPhoneAccountLabel());
+      phoneAccountView.setTextColor(row.getPhoneAccountColor());
       phoneAccountView.setVisibility(View.VISIBLE);
     } else {
       phoneAccountView.setVisibility(View.GONE);
@@ -269,7 +266,7 @@
     public void onSuccess(CoalescedRow updatedRow) {
       // If the user scrolled then this ViewHolder may not correspond to the completed task and
       // there's nothing to do.
-      if (originalRow.id() != currentRowId) {
+      if (originalRow.getId() != currentRowId) {
         return;
       }
       // Only update the UI if the updated row differs from the original row (which has already
diff --git a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
index b7cb6d7..b955e02 100644
--- a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
+++ b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
@@ -97,22 +97,22 @@
   @MainThread
   ListenableFuture<CoalescedRow> applyRealtimeProcessing(final CoalescedRow row) {
     // Cp2DefaultDirectoryPhoneLookup can not always efficiently process all rows.
-    if (!row.numberAttributes().getIsCp2InfoIncomplete()) {
+    if (!row.getNumberAttributes().getIsCp2InfoIncomplete()) {
       return Futures.immediateFuture(row);
     }
 
-    PhoneLookupInfo cachedPhoneLookupInfo = cache.get(row.number());
+    PhoneLookupInfo cachedPhoneLookupInfo = cache.get(row.getNumber());
     if (cachedPhoneLookupInfo != null) {
       return Futures.immediateFuture(applyPhoneLookupInfoToRow(cachedPhoneLookupInfo, row));
     }
 
     ListenableFuture<PhoneLookupInfo> phoneLookupInfoFuture =
-        compositePhoneLookup.lookup(row.number());
+        compositePhoneLookup.lookup(row.getNumber());
     return Futures.transform(
         phoneLookupInfoFuture,
         phoneLookupInfo -> {
-          queuePhoneLookupHistoryWrite(row.number(), phoneLookupInfo);
-          cache.put(row.number(), phoneLookupInfo);
+          queuePhoneLookupHistoryWrite(row.getNumber(), phoneLookupInfo);
+          cache.put(row.getNumber(), phoneLookupInfo);
           return applyPhoneLookupInfoToRow(phoneLookupInfo, row);
         },
         uiExecutor /* ensures the cache is updated on a single thread */);
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index 69b42e3..aeb69a7 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -51,15 +51,15 @@
     // Conditionally add each module, which are items in the bottom sheet's menu.
     List<HistoryItemActionModule> modules = new ArrayList<>();
 
-    String normalizedNumber = row.number().getNormalizedNumber();
+    String normalizedNumber = row.getNumber().getNormalizedNumber();
     boolean canPlaceCalls =
-        PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.numberPresentation());
+        PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.getNumberPresentation());
 
     if (canPlaceCalls) {
       modules.addAll(createModulesForCalls(context, row, normalizedNumber));
       Optional<HistoryItemActionModule> moduleForSendingTextMessage =
           SharedModules.createModuleForSendingTextMessage(
-              context, normalizedNumber, row.numberAttributes().getIsBlocked());
+              context, normalizedNumber, row.getNumberAttributes().getIsBlocked());
       if (moduleForSendingTextMessage.isPresent()) {
         modules.add(moduleForSendingTextMessage.get());
       }
@@ -76,29 +76,29 @@
       Optional<HistoryItemActionModule> moduleForAddingToContacts =
           SharedModules.createModuleForAddingToContacts(
               context,
-              row.number(),
-              row.numberAttributes().getName(),
-              row.numberAttributes().getLookupUri(),
-              row.numberAttributes().getIsBlocked(),
-              row.numberAttributes().getIsSpam());
+              row.getNumber(),
+              row.getNumberAttributes().getName(),
+              row.getNumberAttributes().getLookupUri(),
+              row.getNumberAttributes().getIsBlocked(),
+              row.getNumberAttributes().getIsSpam());
       if (moduleForAddingToContacts.isPresent()) {
         modules.add(moduleForAddingToContacts.get());
       }
 
       BlockReportSpamDialogInfo blockReportSpamDialogInfo =
           BlockReportSpamDialogInfo.newBuilder()
-              .setNormalizedNumber(row.number().getNormalizedNumber())
-              .setCountryIso(row.number().getCountryIso())
-              .setCallType(row.callType())
+              .setNormalizedNumber(row.getNumber().getNormalizedNumber())
+              .setCountryIso(row.getNumber().getCountryIso())
+              .setCallType(row.getCallType())
               .setReportingLocation(ReportingLocation.Type.CALL_LOG_HISTORY)
-              .setContactSource(row.numberAttributes().getContactSource())
+              .setContactSource(row.getNumberAttributes().getContactSource())
               .build();
       modules.addAll(
           SharedModules.createModulesHandlingBlockedOrSpamNumber(
               context,
               blockReportSpamDialogInfo,
-              row.numberAttributes().getIsBlocked(),
-              row.numberAttributes().getIsSpam()));
+              row.getNumberAttributes().getIsBlocked(),
+              row.getNumberAttributes().getIsSpam()));
 
       Optional<HistoryItemActionModule> moduleForCopyingNumber =
           SharedModules.createModuleForCopyingNumber(context, normalizedNumber);
@@ -109,7 +109,7 @@
 
     modules.add(createModuleForAccessingCallDetails(context, row));
 
-    modules.add(new DeleteCallLogItemModule(context, row.coalescedIds()));
+    modules.add(new DeleteCallLogItemModule(context, row.getCoalescedIds()));
 
     return modules;
   }
@@ -117,14 +117,14 @@
   private static List<HistoryItemActionModule> createModulesForCalls(
       Context context, CoalescedRow row, String normalizedNumber) {
     // Don't add call options if a number is blocked.
-    if (row.numberAttributes().getIsBlocked()) {
+    if (row.getNumberAttributes().getIsBlocked()) {
       return Collections.emptyList();
     }
 
     List<HistoryItemActionModule> modules = new ArrayList<>();
     PhoneAccountHandle phoneAccountHandle =
         TelecomUtil.composePhoneAccountHandle(
-            row.phoneAccountComponentName(), row.phoneAccountId());
+            row.getPhoneAccountComponentName(), row.getPhoneAccountId());
 
     // Add an audio call item
     modules.add(
@@ -132,8 +132,8 @@
             context, normalizedNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG));
 
     // Add a video item if (1) the call log entry is for a video call, and (2) the call is not spam.
-    if ((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO
-        && !row.numberAttributes().getIsSpam()) {
+    if ((row.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO
+        && !row.getNumberAttributes().getIsSpam()) {
       modules.add(
           IntentModule.newVideoCallModule(
               context, normalizedNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG));
@@ -147,14 +147,15 @@
 
   private static HistoryItemActionModule createModuleForAccessingCallDetails(
       Context context, CoalescedRow row) {
-    boolean canReportAsInvalidNumber = row.numberAttributes().getCanReportAsInvalidNumber();
-    boolean canSupportAssistedDialing = !TextUtils.isEmpty(row.numberAttributes().getLookupUri());
+    boolean canReportAsInvalidNumber = row.getNumberAttributes().getCanReportAsInvalidNumber();
+    boolean canSupportAssistedDialing =
+        !TextUtils.isEmpty(row.getNumberAttributes().getLookupUri());
 
     return new IntentModule(
         context,
         CallDetailsActivity.newInstance(
             context,
-            row.coalescedIds(),
+            row.getCoalescedIds(),
             createCallDetailsHeaderInfoFromRow(context, row),
             canReportAsInvalidNumber,
             canSupportAssistedDialing),
@@ -165,7 +166,7 @@
   private static CallDetailsHeaderInfo createCallDetailsHeaderInfoFromRow(
       Context context, CoalescedRow row) {
     return CallDetailsHeaderInfo.newBuilder()
-        .setDialerPhoneNumber(row.number())
+        .setDialerPhoneNumber(row.getNumber())
         .setPhotoInfo(createPhotoInfoFromRow(row))
         .setPrimaryText(CallLogEntryText.buildPrimaryText(context, row).toString())
         .setSecondaryText(
@@ -174,13 +175,10 @@
   }
 
   private static PhotoInfo createPhotoInfoFromRow(CoalescedRow row) {
-    PhotoInfo.Builder photoInfoBuilder =
-        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
-            .setIsVideo((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO)
-            .setIsVoicemail(row.isVoicemailCall());
-    if (!TextUtils.isEmpty(row.formattedNumber())) {
-      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
-    }
-    return photoInfoBuilder.build();
+    return NumberAttributesConverter.toPhotoInfoBuilder(row.getNumberAttributes())
+        .setFormattedNumber(row.getFormattedNumber())
+        .setIsVideo((row.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO)
+        .setIsVoicemail(row.getIsVoicemailCall())
+        .build();
   }
 }
diff --git a/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java b/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
index 9efe907..5be19ce 100644
--- a/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
+++ b/java/com/android/dialer/calllog/ui/menu/NewCallLogMenu.java
@@ -42,11 +42,11 @@
 
       // If the user opens the bottom sheet for a new call, clear the notifications and make the row
       // not bold immediately. To do this, mark all of the calls in group as not new.
-      if (row.isNew() && row.callType() == Calls.MISSED_TYPE) {
+      if (row.getIsNew() && row.getCallType() == Calls.MISSED_TYPE) {
         Futures.addCallback(
             CallLogComponent.get(context)
                 .getClearMissedCalls()
-                .clearBySystemCallLogId(row.coalescedIds().getCoalescedIdList()),
+                .clearBySystemCallLogId(row.getCoalescedIds().getCoalescedIdList()),
             new DefaultFutureCallback<>(),
             MoreExecutors.directExecutor());
       }
diff --git a/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java b/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
index aec4dc6..279869d 100644
--- a/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
+++ b/java/com/android/dialer/calllog/ui/menu/PrimaryAction.java
@@ -18,12 +18,10 @@
 
 import android.content.Context;
 import android.provider.CallLog.Calls;
-import android.text.TextUtils;
 import com.android.dialer.calllog.model.CoalescedRow;
 import com.android.dialer.calllogutils.CallLogEntryText;
 import com.android.dialer.calllogutils.CallLogIntents;
 import com.android.dialer.calllogutils.NumberAttributesConverter;
-import com.android.dialer.glidephotomanager.PhotoInfo;
 import com.android.dialer.historyitemactions.HistoryItemPrimaryActionInfo;
 
 /** Configures the primary action row (top row) for the bottom sheet. */
@@ -32,16 +30,13 @@
   static HistoryItemPrimaryActionInfo fromRow(Context context, CoalescedRow row) {
     CharSequence primaryText = CallLogEntryText.buildPrimaryText(context, row);
 
-    PhotoInfo.Builder photoInfoBuilder =
-        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
-            .setIsVideo((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO);
-    if (!TextUtils.isEmpty(row.formattedNumber())) {
-      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
-    }
-
     return HistoryItemPrimaryActionInfo.builder()
-        .setNumber(row.number())
-        .setPhotoInfo(photoInfoBuilder.build())
+        .setNumber(row.getNumber())
+        .setPhotoInfo(
+            NumberAttributesConverter.toPhotoInfoBuilder(row.getNumberAttributes())
+                .setFormattedNumber(row.getFormattedNumber())
+                .setIsVideo((row.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO)
+                .build())
         .setPrimaryText(primaryText)
         .setSecondaryText(CallLogEntryText.buildSecondaryTextForBottomSheet(context, row))
         .setIntent(CallLogIntents.getCallBackIntent(context, row))
diff --git a/java/com/android/dialer/calllogutils/CallLogEntryText.java b/java/com/android/dialer/calllogutils/CallLogEntryText.java
index 6f1047c..c778691 100644
--- a/java/com/android/dialer/calllogutils/CallLogEntryText.java
+++ b/java/com/android/dialer/calllogutils/CallLogEntryText.java
@@ -43,23 +43,23 @@
   public static CharSequence buildPrimaryText(Context context, CoalescedRow row) {
     // Always prefer the presentation name, like "Restricted".
     Optional<String> presentationName =
-        PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation());
+        PhoneNumberDisplayUtil.getNameForPresentation(context, row.getNumberPresentation());
     if (presentationName.isPresent()) {
       return presentationName.get();
     }
 
-    if (row.isVoicemailCall() && !TextUtils.isEmpty(row.voicemailCallTag())) {
-      return row.voicemailCallTag();
+    if (row.getIsVoicemailCall() && !TextUtils.isEmpty(row.getVoicemailCallTag())) {
+      return row.getVoicemailCallTag();
     }
 
     // Otherwise prefer the name.
-    if (!TextUtils.isEmpty(row.numberAttributes().getName())) {
-      return row.numberAttributes().getName();
+    if (!TextUtils.isEmpty(row.getNumberAttributes().getName())) {
+      return row.getNumberAttributes().getName();
     }
 
     // Otherwise prefer the formatted number.
-    if (!TextUtils.isEmpty(row.formattedNumber())) {
-      return row.formattedNumber();
+    if (!TextUtils.isEmpty(row.getFormattedNumber())) {
+      return row.getFormattedNumber();
     }
 
     // If there's no formatted number, just return "Unknown".
@@ -99,17 +99,18 @@
       Context context, Clock clock, CoalescedRow row) {
     List<CharSequence> components = new ArrayList<>();
 
-    if (row.numberAttributes().getIsBlocked()) {
+    if (row.getNumberAttributes().getIsBlocked()) {
       components.add(context.getText(R.string.new_call_log_secondary_blocked));
     }
-    if (row.numberAttributes().getIsSpam()) {
+    if (row.getNumberAttributes().getIsSpam()) {
       components.add(context.getText(R.string.new_call_log_secondary_spam));
     }
 
     components.add(getNumberTypeLabel(context, row));
 
     components.add(
-        CallLogDates.newCallLogTimestampLabel(context, clock.currentTimeMillis(), row.timestamp()));
+        CallLogDates.newCallLogTimestampLabel(
+            context, clock.currentTimeMillis(), row.getTimestamp()));
     return joinSecondaryTextComponents(components);
   }
 
@@ -147,10 +148,10 @@
      */
     List<CharSequence> components = new ArrayList<>();
 
-    if (row.numberAttributes().getIsBlocked()) {
+    if (row.getNumberAttributes().getIsBlocked()) {
       components.add(context.getText(R.string.new_call_log_secondary_blocked));
     }
-    if (row.numberAttributes().getIsSpam()) {
+    if (row.getNumberAttributes().getIsSpam()) {
       components.add(context.getText(R.string.new_call_log_secondary_spam));
     }
 
@@ -159,20 +160,20 @@
     // If there's a presentation name, we showed it in the primary text and shouldn't show any name
     // or number here.
     Optional<String> presentationName =
-        PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation());
+        PhoneNumberDisplayUtil.getNameForPresentation(context, row.getNumberPresentation());
     if (presentationName.isPresent()) {
       return joinSecondaryTextComponents(components);
     }
 
-    if (TextUtils.isEmpty(row.numberAttributes().getName())) {
+    if (TextUtils.isEmpty(row.getNumberAttributes().getName())) {
       // If the name is empty the number is shown as the primary text and there's nothing to add.
       return joinSecondaryTextComponents(components);
     }
-    if (TextUtils.isEmpty(row.formattedNumber())) {
+    if (TextUtils.isEmpty(row.getFormattedNumber())) {
       // If there's no number, don't append anything.
       return joinSecondaryTextComponents(components);
     }
-    components.add(row.formattedNumber());
+    components.add(row.getFormattedNumber());
     return joinSecondaryTextComponents(components);
   }
 
@@ -186,19 +187,19 @@
    */
   private static CharSequence getNumberTypeLabel(Context context, CoalescedRow row) {
     StringBuilder secondaryText = new StringBuilder();
-    if ((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) {
+    if ((row.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) {
       // TODO(zachh): Add "Duo" prefix?
       secondaryText.append(context.getText(R.string.new_call_log_video));
     }
-    String numberTypeLabel = row.numberAttributes().getNumberTypeLabel();
+    String numberTypeLabel = row.getNumberAttributes().getNumberTypeLabel();
     if (!TextUtils.isEmpty(numberTypeLabel)) {
       if (secondaryText.length() > 0) {
         secondaryText.append(", ");
       }
       secondaryText.append(numberTypeLabel);
-    } else if (!row.numberAttributes().getIsSpam()) {
+    } else if (!row.getNumberAttributes().getIsSpam()) {
       // Don't show the location if there's a number type label or the number is spam.
-      String location = row.geocodedLocation();
+      String location = row.getGeocodedLocation();
       if (!TextUtils.isEmpty(location)) {
         if (secondaryText.length() > 0) {
           secondaryText.append(", ");
diff --git a/java/com/android/dialer/calllogutils/CallLogIntents.java b/java/com/android/dialer/calllogutils/CallLogIntents.java
index 64fb33d..18927f7 100644
--- a/java/com/android/dialer/calllogutils/CallLogIntents.java
+++ b/java/com/android/dialer/calllogutils/CallLogIntents.java
@@ -39,8 +39,8 @@
    */
   @Nullable
   public static Intent getCallBackIntent(Context context, CoalescedRow row) {
-    String normalizedNumber = row.number().getNormalizedNumber();
-    if (!PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.numberPresentation())) {
+    String normalizedNumber = row.getNumber().getNormalizedNumber();
+    if (!PhoneNumberHelper.canPlaceCallsTo(normalizedNumber, row.getNumberPresentation())) {
       return null;
     }
 
@@ -50,7 +50,7 @@
         new CallIntentBuilder(normalizedNumber, CallInitiationType.Type.CALL_LOG)
             .setPhoneAccountHandle(
                 TelecomUtil.composePhoneAccountHandle(
-                    row.phoneAccountComponentName(), row.phoneAccountId()))
-            .setIsVideoCall((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO));
+                    row.getPhoneAccountComponentName(), row.getPhoneAccountId()))
+            .setIsVideoCall((row.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO));
   }
 }