speech: Allow long speech sessions

Bug: 204189031
Cts-Coverage-Bug: 204189031
Test: atest
Change-Id: I348fbcd701e8e7f94f3ef7a559ed8d323af112c8
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
index 6debb44..a4dba5e 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
@@ -16,8 +16,10 @@
 
 package android.voicerecognition.cts;
 
+import static android.voicerecognition.cts.CallbackMethod.CALLBACK_METHOD_END_SEGMENTED_SESSION;
 import static android.voicerecognition.cts.CallbackMethod.CALLBACK_METHOD_ERROR;
 import static android.voicerecognition.cts.CallbackMethod.CALLBACK_METHOD_RESULTS;
+import static android.voicerecognition.cts.CallbackMethod.CALLBACK_METHOD_SEGMENTS_RESULTS;
 import static android.voicerecognition.cts.CallbackMethod.CALLBACK_METHOD_UNSPECIFIED;
 import static android.voicerecognition.cts.RecognizerMethod.RECOGNIZER_METHOD_CANCEL;
 import static android.voicerecognition.cts.RecognizerMethod.RECOGNIZER_METHOD_DESTROY;
@@ -172,6 +174,25 @@
     }
 
     @Test
+    public void setSequenceTest_startListening_segment_endofsession() {
+        executeSequenceTest(
+                /* service methods to call: */ ImmutableList.of(
+                        RECOGNIZER_METHOD_START_LISTENING,
+                        RECOGNIZER_METHOD_STOP_LISTENING
+                        ),
+                /* callback methods to call: */ ImmutableList.of(
+                        CALLBACK_METHOD_SEGMENTS_RESULTS,
+                        CALLBACK_METHOD_END_SEGMENTED_SESSION
+                        ),
+                /* expected service methods propagated: */ ImmutableList.of(true, true, true),
+                /* expected callback methods invoked: */ ImmutableList.of(
+                        CALLBACK_METHOD_SEGMENTS_RESULTS,
+                        CALLBACK_METHOD_END_SEGMENTED_SESSION
+                )
+        );
+    }
+
+    @Test
     public void sequenceTest_startListening_cancel() {
         executeSequenceTest(
                 /* service methods to call: */ ImmutableList.of(
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CallbackMethod.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CallbackMethod.java
index b8622f4..fb6c0a5 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CallbackMethod.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CallbackMethod.java
@@ -25,5 +25,7 @@
     CALLBACK_METHOD_PARTIAL_RESULTS,
     CALLBACK_METHOD_READY_FOR_SPEECH,
     CALLBACK_METHOD_RESULTS,
-    CALLBACK_METHOD_RMS_CHANGED
+    CALLBACK_METHOD_RMS_CHANGED,
+    CALLBACK_METHOD_SEGMENTS_RESULTS,
+    CALLBACK_METHOD_END_SEGMENTED_SESSION
 }
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
index 5627c9d..375b360 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
@@ -21,6 +21,7 @@
 import static android.voicerecognition.cts.TestObjects.READY_FOR_SPEECH_BUNDLE;
 import static android.voicerecognition.cts.TestObjects.RESULTS_BUNDLE;
 import static android.voicerecognition.cts.TestObjects.RMS_CHANGED_VALUE;
+import static android.voicerecognition.cts.TestObjects.SEGMENT_RESULTS_BUNDLE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -120,6 +121,12 @@
                 case CALLBACK_METHOD_RMS_CHANGED:
                     listener.rmsChanged(RMS_CHANGED_VALUE);
                     break;
+                case CALLBACK_METHOD_SEGMENTS_RESULTS:
+                    listener.segmentResults(SEGMENT_RESULTS_BUNDLE);
+                    break;
+                case CALLBACK_METHOD_END_SEGMENTED_SESSION:
+                    listener.endOfSegmentedSession();
+                    break;
                 default:
                     fail();
             }
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
index a9d506a..0efae9c 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
@@ -24,7 +24,8 @@
 import android.speech.RecognitionListener;
 import android.speech.RecognizerIntent;
 import android.speech.SpeechRecognizer;
-import android.util.Log;
+
+import androidx.annotation.NonNull;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -151,6 +152,16 @@
         }
 
         @Override
+        public void onSegmentResults(@NonNull Bundle segmentResults) {
+            mCallbackMethodsInvoked.add(CallbackMethod.CALLBACK_METHOD_SEGMENTS_RESULTS);
+        }
+
+        @Override
+        public void onEndOfSegmentedSession() {
+            mCallbackMethodsInvoked.add(CallbackMethod.CALLBACK_METHOD_END_SEGMENTED_SESSION);
+        }
+
+        @Override
         public void onEvent(int eventType, Bundle params) {
         }
     }
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/TestObjects.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/TestObjects.java
index b507f21..99fa452 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/TestObjects.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/TestObjects.java
@@ -41,4 +41,8 @@
     static {
         START_LISTENING_INTENT.putExtra("d", 'd');
     }
+    public static final Bundle SEGMENT_RESULTS_BUNDLE = new Bundle();
+    static {
+        SEGMENT_RESULTS_BUNDLE.putChar("e", 'e');
+    }
 }