Merge "Add Support for transcription state in the AnnotatedCallLog"
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
index fea3e91..c838737 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogDatabaseHelper.java
@@ -55,7 +55,8 @@
           + (AnnotatedCallLog.TRANSCRIPTION + " integer, ")
           + (AnnotatedCallLog.VOICEMAIL_URI + " text, ")
           + (AnnotatedCallLog.CALL_TYPE + " integer not null, ")
-          + (AnnotatedCallLog.NUMBER_ATTRIBUTES + " blob")
+          + (AnnotatedCallLog.NUMBER_ATTRIBUTES + " blob, ")
+          + (AnnotatedCallLog.TRANSCRIPTION_STATE + " integer")
           + ");";
 
   /**
diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
index 4fee4e5..c181d75 100644
--- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
+++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
@@ -17,7 +17,9 @@
 package com.android.dialer.calllog.database.contract;
 
 import android.net.Uri;
+import android.os.Build;
 import android.provider.BaseColumns;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.constants.Constants;
 import java.util.Arrays;
 
@@ -200,6 +202,15 @@
     public static final String TRANSCRIPTION = "transcription";
 
     /**
+     * See {@link VoicemailCompat.TRANSCRIPTION_STATE}
+     *
+     * <p>Only populated in {@link Build.VERSION_CODES.O} and above
+     *
+     * <p>TYPE: INTEGER
+     */
+    public static final String TRANSCRIPTION_STATE = "transcription_state";
+
+    /**
      * See {@link android.provider.CallLog.Calls#VOICEMAIL_URI}.
      *
      * <p>TYPE: TEXT
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 24410ee..ee484d9 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -24,6 +24,8 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Build;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
 import android.os.Handler;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
@@ -32,6 +34,7 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.MainThread;
 import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.WorkerThread;
 import android.telecom.PhoneAccount;
@@ -49,6 +52,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
 import com.android.dialer.storage.StorageComponent;
 import com.android.dialer.telecom.TelecomUtil;
@@ -58,6 +62,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -235,26 +240,7 @@
             .getContentResolver()
             .query(
                 Calls.CONTENT_URI_WITH_VOICEMAIL,
-                new String[] {
-                  Calls._ID,
-                  Calls.DATE,
-                  Calls.LAST_MODIFIED, // TODO(a bug): Not available in M
-                  Calls.NUMBER,
-                  Calls.NUMBER_PRESENTATION,
-                  Calls.TYPE,
-                  Calls.COUNTRY_ISO,
-                  Calls.DURATION,
-                  Calls.DATA_USAGE,
-                  Calls.TRANSCRIPTION,
-                  Calls.VOICEMAIL_URI,
-                  Calls.IS_READ,
-                  Calls.NEW,
-                  Calls.GEOCODED_LOCATION,
-                  Calls.PHONE_ACCOUNT_COMPONENT_NAME,
-                  Calls.PHONE_ACCOUNT_ID,
-                  Calls.FEATURES,
-                  Calls.POST_DIAL_DIGITS // TODO(a bug): Not available in M
-                },
+                getProjection(),
                 // TODO(a bug): LAST_MODIFIED not available on M
                 Calls.LAST_MODIFIED + " > ? AND " + Voicemails.DELETED + " = 0",
                 new String[] {String.valueOf(previousTimestampProcessed)},
@@ -358,6 +344,7 @@
           contentValues.put(AnnotatedCallLog.DATA_USAGE, dataUsage);
           contentValues.put(AnnotatedCallLog.TRANSCRIPTION, transcription);
           contentValues.put(AnnotatedCallLog.VOICEMAIL_URI, voicemailUri);
+          setTranscriptionState(cursor, contentValues);
 
           if (existingAnnotatedCallLogIds.contains(id)) {
             mutations.update(id, contentValues);
@@ -369,6 +356,53 @@
     }
   }
 
+  private void setTranscriptionState(Cursor cursor, ContentValues contentValues) {
+    if (VERSION.SDK_INT >= VERSION_CODES.O) {
+      int transcriptionStateColumn =
+          cursor.getColumnIndexOrThrow(VoicemailCompat.TRANSCRIPTION_STATE);
+      int transcriptionState = cursor.getInt(transcriptionStateColumn);
+      contentValues.put(VoicemailCompat.TRANSCRIPTION_STATE, transcriptionState);
+    }
+  }
+
+  private static final String[] PROJECTION_PRE_O =
+      new String[] {
+        Calls._ID,
+        Calls.DATE,
+        Calls.LAST_MODIFIED, // TODO(a bug): Not available in M
+        Calls.NUMBER,
+        Calls.NUMBER_PRESENTATION,
+        Calls.TYPE,
+        Calls.COUNTRY_ISO,
+        Calls.DURATION,
+        Calls.DATA_USAGE,
+        Calls.TRANSCRIPTION,
+        Calls.VOICEMAIL_URI,
+        Calls.IS_READ,
+        Calls.NEW,
+        Calls.GEOCODED_LOCATION,
+        Calls.PHONE_ACCOUNT_COMPONENT_NAME,
+        Calls.PHONE_ACCOUNT_ID,
+        Calls.FEATURES,
+        Calls.POST_DIAL_DIGITS // TODO(a bug): Not available in M
+      };
+
+  @RequiresApi(VERSION_CODES.O)
+  private static final String[] PROJECTION_O_AND_LATER;
+
+  static {
+    List<String> projectionList = new ArrayList<>(Arrays.asList(PROJECTION_PRE_O));
+    projectionList.add(VoicemailCompat.TRANSCRIPTION_STATE);
+    PROJECTION_O_AND_LATER = projectionList.toArray(new String[projectionList.size()]);
+  }
+
+  private String[] getProjection() {
+    if (VERSION.SDK_INT >= VERSION_CODES.O) {
+      return PROJECTION_O_AND_LATER;
+    }
+    return PROJECTION_PRE_O;
+  }
+
   private void populatePhoneAccountLabelAndColor(
       Context appContext,
       ContentValues contentValues,
diff --git a/java/com/android/dialer/compat/android/provider/VoicemailCompat.java b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java
index 02eebb3..35e0ea5 100644
--- a/java/com/android/dialer/compat/android/provider/VoicemailCompat.java
+++ b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java
@@ -16,10 +16,10 @@
 package com.android.dialer.compat.android.provider;
 
 /**
- * Provide access to new API constants before they're publicly available
+ * Provide access to Voicemail Transcription API constants as they won't be publicly available.
  *
- * <p>Copied from android.provider.VoicemailContract.Voicemails. These should become public in O-MR1
- * and these constants can be removed then.
+ * <p>Copied from android.provider.VoicemailContract.Voicemails. These do not plan to become public
+ * in O-MR1 or in the near future.
  */
 public class VoicemailCompat {
 
diff --git a/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java b/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
index 74d1b61..11e7888 100644
--- a/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
+++ b/java/com/android/dialer/voicemail/listui/VoicemailCursorLoader.java
@@ -45,6 +45,7 @@
         AnnotatedCallLog.VOICEMAIL_URI,
         AnnotatedCallLog.IS_READ,
         AnnotatedCallLog.NUMBER_ATTRIBUTES,
+        AnnotatedCallLog.TRANSCRIPTION_STATE
       };
 
   // Indexes for VOICEMAIL_COLUMNS
@@ -59,6 +60,7 @@
   private static final int VOICEMAIL_URI = 8;
   private static final int IS_READ = 9;
   private static final int NUMBER_ATTRIBUTES = 10;
+  private static final int TRANSCRIPTION_STATE = 11;
 
   // TODO(zachh): Optimize indexes
   VoicemailCursorLoader(Context context) {
@@ -105,6 +107,7 @@
         .setCallType(cursor.getInt(CALL_TYPE))
         .setIsRead(cursor.getInt(IS_READ))
         .setNumberAttributes(numberAttributes)
+        .setTranscriptionState(cursor.getInt(TRANSCRIPTION_STATE))
         .build();
   }
 
diff --git a/java/com/android/dialer/voicemail/model/VoicemailEntry.java b/java/com/android/dialer/voicemail/model/VoicemailEntry.java
index f17a23e..5830fb1 100644
--- a/java/com/android/dialer/voicemail/model/VoicemailEntry.java
+++ b/java/com/android/dialer/voicemail/model/VoicemailEntry.java
@@ -20,6 +20,7 @@
 import android.support.annotation.Nullable;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.NumberAttributes;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.google.auto.value.AutoValue;
 
 /** Data class containing the contents of a voicemail entry from the AnnotatedCallLog. */
@@ -34,7 +35,8 @@
         .setNumberAttributes(NumberAttributes.getDefaultInstance())
         .setDuration(0)
         .setCallType(0)
-        .setIsRead(0);
+        .setIsRead(0)
+        .setTranscriptionState(VoicemailCompat.TRANSCRIPTION_NOT_STARTED);
   }
 
   public abstract int id();
@@ -44,7 +46,6 @@
   @NonNull
   public abstract DialerPhoneNumber number();
 
-
   @Nullable
   public abstract String formattedNumber();
 
@@ -65,6 +66,8 @@
 
   public abstract NumberAttributes numberAttributes();
 
+  public abstract int transcriptionState();
+
   /** Builder for {@link VoicemailEntry}. */
   @AutoValue.Builder
   public abstract static class Builder {
@@ -91,6 +94,8 @@
 
     public abstract Builder setNumberAttributes(NumberAttributes numberAttributes);
 
+    public abstract Builder setTranscriptionState(int transcriptionState);
+
     public abstract VoicemailEntry build();
   }
 }