Merge "Use existing transcription from transcription server if available"
diff --git a/java/com/android/voicemail/impl/transcribe/GetTranscriptReceiver.java b/java/com/android/voicemail/impl/transcribe/GetTranscriptReceiver.java
index cbf1657..5c5bae5 100644
--- a/java/com/android/voicemail/impl/transcribe/GetTranscriptReceiver.java
+++ b/java/com/android/voicemail/impl/transcribe/GetTranscriptReceiver.java
@@ -295,7 +295,7 @@
     transcriptionClientFactoryForTesting = factory;
   }
 
-  private static TranscriptionClientFactory getTranscriptionClientFactory(Context context) {
+  static TranscriptionClientFactory getTranscriptionClientFactory(Context context) {
     if (transcriptionClientFactoryForTesting != null) {
       return transcriptionClientFactoryForTesting;
     }
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionTaskAsync.java b/java/com/android/voicemail/impl/transcribe/TranscriptionTaskAsync.java
index 60a6811..034af6b 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionTaskAsync.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionTaskAsync.java
@@ -83,6 +83,16 @@
     } else if (uploadResponse == null) {
       VvmLog.i(TAG, "getTranscription, failed to upload voicemail.");
       return new Pair<>(null, TranscriptionStatus.FAILED_NO_RETRY);
+    } else if (uploadResponse.isStatusAlreadyExists()) {
+      VvmLog.i(TAG, "getTranscription, transcription already exists.");
+      GetTranscriptReceiver.beginPolling(
+          context,
+          voicemailUri,
+          uploadRequest.getTranscriptionId(),
+          0,
+          configProvider,
+          phoneAccountHandle);
+      return new Pair<>(null, null);
     } else if (uploadResponse.getTranscriptionId() == null) {
       VvmLog.i(TAG, "getTranscription, upload error: " + uploadResponse.status);
       return new Pair<>(null, TranscriptionStatus.FAILED_NO_RETRY);
diff --git a/java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponse.java b/java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponse.java
index ae4796d..bd65abe 100644
--- a/java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponse.java
+++ b/java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponse.java
@@ -18,6 +18,7 @@
 import android.support.annotation.Nullable;
 import com.android.dialer.common.Assert;
 import io.grpc.Status;
+import io.grpc.Status.Code;
 
 /**
  * Base class for encapulating a voicemail transcription server response. This handles the Grpc
@@ -43,6 +44,14 @@
     return false;
   }
 
+  public boolean isStatusAlreadyExists() {
+    if (status != null) {
+      return status.getCode() == Code.ALREADY_EXISTS;
+    }
+
+    return false;
+  }
+
   public boolean hasFatalError() {
     if (status != null) {
       return status.getCode() != Status.Code.OK && status.getCode() != Status.Code.UNAVAILABLE;