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(() -> {