Use existing transcription from transcription server if available

Repeated requests from the server responds in an ALREADY_EXISTS error and does not transcribe the voicemails. In that case we should ask the server if the request is present already on the server, and if so retrieve it.

Bug: 77236260
Test: N/A
PiperOrigin-RevId: 191016332
Change-Id: I605c546a3bec3599c7b162853463ca7e46f63886
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;