speech: Test checkModel/trigger download

Bug: 204189031
Test: atest
Change-Id: Id37d9af4d82c413b5683fd70f836e4df1deaf6fa
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
index a4dba5e..11c282f 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/AbstractRecognitionServiceTest.java
@@ -34,11 +34,16 @@
 
 import static org.junit.Assert.fail;
 
+import android.content.Intent;
 import android.os.SystemClock;
+import android.speech.RecognitionSupport;
+import android.speech.RecognitionSupportCallback;
+import android.speech.RecognizerIntent;
 import android.speech.SpeechRecognizer;
 import android.support.test.uiautomator.UiDevice;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
@@ -111,6 +116,63 @@
     }
 
     @Test
+    public void testCanCheckForSupport() throws Throwable {
+        mUiDevice.waitForIdle();
+        assertThat(mActivity.mRecognizer).isNotNull();
+        setCurrentRecognizer(mActivity.mRecognizer, IN_PACKAGE_RECOGNITION_SERVICE);
+        mUiDevice.waitForIdle();
+
+        List<RecognitionSupport> supportResults = new ArrayList<>();
+        List<Integer> errors = new ArrayList<>();
+        RecognitionSupportCallback supportCallback = new RecognitionSupportCallback() {
+            @Override
+            public void onSupportResult(@NonNull RecognitionSupport recognitionSupport) {
+                supportResults.add(recognitionSupport);
+            }
+
+            @Override
+            public void onError(int error) {
+                errors.add(error);
+            }
+        };
+        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+        mActivity.checkRecognitionSupport(intent, supportCallback);
+        PollingCheck.waitFor(SEQUENCE_TEST_WAIT_TIMEOUT_MS,
+                () -> supportResults.size() + errors.size() > 0);
+        assertThat(supportResults).isEmpty();
+        assertThat(errors).containsExactly(SpeechRecognizer.ERROR_CANNOT_CHECK_SUPPORT);
+
+        errors.clear();
+        RecognitionSupport rs = new RecognitionSupport.Builder()
+                .addInstalledLanguages("en")
+                .addPendingLanguages("jp")
+                .addSupportedLanguages("de")
+                .build();
+        CtsRecognitionService.sConsumerQueue.add(c -> c.onSupportResult(rs));
+
+        mActivity.checkRecognitionSupport(intent, supportCallback);
+        PollingCheck.waitFor(SEQUENCE_TEST_WAIT_TIMEOUT_MS,
+                () -> supportResults.size() + errors.size() > 0);
+        assertThat(errors).isEmpty();
+        assertThat(supportResults).containsExactly(rs);
+    }
+
+    @Test
+    public void testCanTriggerModelDownload() throws Throwable {
+        mUiDevice.waitForIdle();
+        assertThat(mActivity.mRecognizer).isNotNull();
+        setCurrentRecognizer(mActivity.mRecognizer, IN_PACKAGE_RECOGNITION_SERVICE);
+        mUiDevice.waitForIdle();
+
+        CtsRecognitionService.sDownloadTriggers.clear();
+        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+        mActivity.triggerModelDownload(intent);
+        PollingCheck.waitFor(SEQUENCE_TEST_WAIT_TIMEOUT_MS,
+                () -> CtsRecognitionService.sDownloadTriggers.size() > 0);
+        assertThat(CtsRecognitionService.sDownloadTriggers).hasSize(1);
+    }
+
+    @Test
     public void sequenceTest_startListening_stopListening_results() {
         executeSequenceTest(
                 /* service methods to call: */ ImmutableList.of(
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
index 375b360..fa813fd 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/CtsRecognitionService.java
@@ -30,14 +30,18 @@
 import android.content.Intent;
 import android.os.RemoteException;
 import android.speech.RecognitionService;
+import android.speech.SpeechRecognizer;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Queue;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 
 public class CtsRecognitionService extends RecognitionService {
     private static final String TAG = CtsRecognitionService.class.getSimpleName();
@@ -45,6 +49,8 @@
     public static List<RecognizerMethod> sInvokedRecognizerMethods = new ArrayList<>();
     public static Queue<CallbackMethod> sInstructedCallbackMethods = new ArrayDeque<>();
     public static AtomicBoolean sIsActive = new AtomicBoolean(false);
+    public static Queue<Consumer<SupportCallback>> sConsumerQueue = new ArrayDeque<>();
+    public static List<Intent> sDownloadTriggers = new ArrayList<>();
 
     private final Random mRandom = new Random();
 
@@ -71,6 +77,23 @@
     }
 
     @Override
+    public void onCheckRecognitionSupport(
+            @NonNull Intent recognizerIntent,
+            @NonNull SupportCallback supportCallback) {
+        Consumer<SupportCallback> consumer = sConsumerQueue.poll();
+        if (consumer == null) {
+            supportCallback.onError(SpeechRecognizer.ERROR_CANNOT_CHECK_SUPPORT);
+        } else {
+            consumer.accept(supportCallback);
+        }
+    }
+
+    @Override
+    public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+        sDownloadTriggers.add(recognizerIntent);
+    }
+
+    @Override
     protected void onCancel(Callback listener) {
         sIsActive.set(true);
         assertThat(listener.getCallingUid()).isEqualTo(android.os.Process.myUid());
diff --git a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
index 0efae9c..977f793 100644
--- a/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
+++ b/tests/tests/voiceRecognition/src/android/voicerecognition/cts/SpeechRecognitionActivity.java
@@ -22,6 +22,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.speech.RecognitionListener;
+import android.speech.RecognitionSupportCallback;
 import android.speech.RecognizerIntent;
 import android.speech.SpeechRecognizer;
 
@@ -87,6 +88,14 @@
         mHandler.post(mRecognizer::destroy);
     }
 
+    public void checkRecognitionSupport(Intent intent, RecognitionSupportCallback rsc) {
+        mHandler.post(() -> mRecognizer.checkRecognitionSupport(intent, rsc));
+    }
+
+    public void triggerModelDownload(Intent intent) {
+        mHandler.post(() -> mRecognizer.triggerModelDownload(intent));
+    }
+
     public void init(boolean onDevice, String customRecognizerComponent) {
         mHandler = new Handler(getMainLooper());
         mHandler.post(() -> {