1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 package com.android.voicemail.impl.transcribe.grpc;
17 
18 import android.support.annotation.Nullable;
19 import android.support.annotation.VisibleForTesting;
20 import com.android.dialer.common.Assert;
21 import com.google.internal.communications.voicemailtranscription.v1.GetTranscriptResponse;
22 import com.google.internal.communications.voicemailtranscription.v1.TranscriptionStatus;
23 import io.grpc.Status;
24 
25 /** Container for response and status objects for an asynchronous get-transcript request */
26 public class GetTranscriptResponseAsync extends TranscriptionResponse {
27   @Nullable private final GetTranscriptResponse response;
28 
29   @VisibleForTesting
GetTranscriptResponseAsync(GetTranscriptResponse response)30   public GetTranscriptResponseAsync(GetTranscriptResponse response) {
31     Assert.checkArgument(response != null);
32     this.response = response;
33   }
34 
35   @VisibleForTesting
GetTranscriptResponseAsync(Status status)36   public GetTranscriptResponseAsync(Status status) {
37     super(status);
38     this.response = null;
39   }
40 
getTranscript()41   public @Nullable String getTranscript() {
42     if (response != null) {
43       return response.getTranscript();
44     }
45     return null;
46   }
47 
getErrorDescription()48   public @Nullable String getErrorDescription() {
49     if (!hasRecoverableError() && !hasFatalError()) {
50       return null;
51     }
52     if (status != null) {
53       return "Grpc error: " + status;
54     }
55     if (response != null) {
56       return "Transcription error: " + response.getStatus();
57     }
58     Assert.fail("Impossible state");
59     return null;
60   }
61 
getTranscriptionStatus()62   public TranscriptionStatus getTranscriptionStatus() {
63     if (response == null) {
64       return TranscriptionStatus.TRANSCRIPTION_STATUS_UNSPECIFIED;
65     } else {
66       return response.getStatus();
67     }
68   }
69 
isTranscribing()70   public boolean isTranscribing() {
71     return response != null && response.getStatus() == TranscriptionStatus.PENDING;
72   }
73 
74   @Override
hasRecoverableError()75   public boolean hasRecoverableError() {
76     if (super.hasRecoverableError()) {
77       return true;
78     }
79 
80     if (response != null) {
81       return response.getStatus() == TranscriptionStatus.EXPIRED
82           || response.getStatus() == TranscriptionStatus.FAILED_RETRY;
83     }
84 
85     return false;
86   }
87 
88   @Override
hasFatalError()89   public boolean hasFatalError() {
90     if (super.hasFatalError()) {
91       return true;
92     }
93 
94     if (response != null) {
95       return response.getStatus() == TranscriptionStatus.FAILED_NO_RETRY
96           || response.getStatus() == TranscriptionStatus.FAILED_LANGUAGE_NOT_SUPPORTED
97           || response.getStatus() == TranscriptionStatus.FAILED_NO_SPEECH_DETECTED;
98     }
99 
100     return false;
101   }
102 }
103