Added temporary logging to debug problem with null phone numbers from remote contacts.

Bug: 68942044
Test: none
PiperOrigin-RevId: 174944384
Change-Id: Ie03ce41e517cfb73081231898a7e9dcc3feee2f2
diff --git a/java/com/android/dialer/searchfragment/list/SearchAdapter.java b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
index dc78953..cc090ac 100644
--- a/java/com/android/dialer/searchfragment/list/SearchAdapter.java
+++ b/java/com/android/dialer/searchfragment/list/SearchAdapter.java
@@ -17,6 +17,7 @@
 package com.android.dialer.searchfragment.list;
 
 import android.content.Context;
+import android.database.Cursor;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.ViewHolder;
@@ -26,12 +27,15 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.searchfragment.common.Projections;
 import com.android.dialer.searchfragment.common.RowClickListener;
 import com.android.dialer.searchfragment.common.SearchCursor;
 import com.android.dialer.searchfragment.cp2.SearchContactViewHolder;
 import com.android.dialer.searchfragment.list.SearchCursorManager.RowType;
 import com.android.dialer.searchfragment.nearbyplaces.NearbyPlaceViewHolder;
 import com.android.dialer.searchfragment.remote.RemoteContactViewHolder;
+import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader;
 import java.util.List;
 
 /** RecyclerView adapter for {@link NewSearchFragment}. */
@@ -99,6 +103,23 @@
     } else if (holder instanceof NearbyPlaceViewHolder) {
       ((NearbyPlaceViewHolder) holder).bind(searchCursorManager.getCursor(position), query);
     } else if (holder instanceof RemoteContactViewHolder) {
+      Cursor cursor = searchCursorManager.getCursor(position);
+      // Temporary logging to identify cause of a bug:
+      if (cursor.getString(Projections.PHONE_NUMBER) == null) {
+        LogUtil.e(
+            "SearchAdapter.onBindViewHolder", "cursor class: %s", cursor.getClass().getName());
+        LogUtil.e("SearchAdapter.onBindViewHolder", "position: %d", position);
+        LogUtil.e(
+            "SearchAdapter.onBindViewHolder",
+            "query length: %s",
+            query == null ? "null" : query.length());
+        logDirectories();
+        LogUtil.e(
+            "SearchAdapter.onBindViewHolder",
+            "directory id: %d",
+            ((SearchCursor) cursor).getDirectoryId());
+        throw new IllegalStateException("Null phone number reading remote contact");
+      }
       ((RemoteContactViewHolder) holder).bind(searchCursorManager.getCursor(position), query);
     } else if (holder instanceof HeaderViewHolder) {
       String header =
@@ -114,6 +135,21 @@
     }
   }
 
+  private void logDirectories() {
+    try (Cursor directories = new RemoteDirectoriesCursorLoader(context).loadInBackground()) {
+      if (directories.moveToFirst()) {
+        do {
+          LogUtil.e(
+              "SearchAdapter.logDirectories",
+              "directory: %s",
+              RemoteDirectoriesCursorLoader.readDirectory(directories));
+        } while (directories.moveToNext());
+      } else {
+        LogUtil.e("SearchAdapter.logDirectories", "no directories found");
+      }
+    }
+  }
+
   public void setContactsCursor(SearchCursor cursor) {
     if (searchCursorManager.setContactsCursor(cursor)) {
       // Since this is a new contacts cursor, we need to reapply the filter.
diff --git a/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java b/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java
index de71025..3d16c43 100644
--- a/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java
@@ -36,12 +36,14 @@
 
   private static final int DISPLAY_NAME = 1;
   private static final int PHOTO_SUPPORT = 2;
+  private static final int AUTHORITY = 3;
 
   @VisibleForTesting
   static final String[] PROJECTION = {
     ContactsContract.Directory._ID,
     ContactsContract.Directory.DISPLAY_NAME,
     ContactsContract.Directory.PHOTO_SUPPORT,
+    ContactsContract.Directory.DIRECTORY_AUTHORITY,
   };
 
   public RemoteDirectoriesCursorLoader(Context context) {
@@ -51,7 +53,10 @@
   /** @return current cursor row represented as a {@link Directory}. */
   public static Directory readDirectory(Cursor cursor) {
     return Directory.create(
-        cursor.getInt(ID), cursor.getString(DISPLAY_NAME), cursor.getInt(PHOTO_SUPPORT) != 0);
+        cursor.getInt(ID),
+        cursor.getString(DISPLAY_NAME),
+        cursor.getInt(PHOTO_SUPPORT) != 0,
+        cursor.getString(AUTHORITY));
   }
 
   private static Uri getContentUri() {
@@ -63,8 +68,14 @@
   /** POJO representing the results returned from {@link RemoteDirectoriesCursorLoader}. */
   @AutoValue
   public abstract static class Directory {
+    public static Directory create(
+        int id, @Nullable String displayName, boolean supportsPhotos, @Nullable String authority) {
+      return new AutoValue_RemoteDirectoriesCursorLoader_Directory(
+          id, displayName, supportsPhotos, authority);
+    }
+
     public static Directory create(int id, @Nullable String displayName, boolean supportsPhotos) {
-      return new AutoValue_RemoteDirectoriesCursorLoader_Directory(id, displayName, supportsPhotos);
+      return create(id, displayName, supportsPhotos, null);
     }
 
     public abstract int getId();
@@ -73,5 +84,7 @@
     abstract @Nullable String getDisplayName();
 
     abstract boolean supportsPhotos();
+
+    abstract @Nullable String authority();
   }
 }