Skip to content

Commit

Permalink
Ensure ShadowSpeechRecognizer can work with SDK 28
Browse files Browse the repository at this point in the history
Use looseSignature and Object to replace RecognitionSupportCallback and
RecognitionSupport to avoid NoClassDefFoundError.

Signed-off-by: utzcoz <utzcoz@outlook.com>
  • Loading branch information
utzcoz authored and hoisie committed Dec 27, 2022
1 parent 4e6047d commit 0df34bf
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
Expand Up @@ -2,6 +2,7 @@ package org.robolectric.integration.compat.target28

import android.content.Context
import android.os.Build
import android.speech.SpeechRecognizer
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -41,4 +42,9 @@ class NormalCompatibilityTest {
val telephonyManager = application.getSystemService(Context.TELEPHONY_SERVICE)
assertThat(telephonyManager).isNotNull()
}

@Test
fun `Create speech recognizer succeed`() {
assertThat(SpeechRecognizer.createSpeechRecognizer(application)).isNotNull()
}
}
Expand Up @@ -12,11 +12,11 @@
import android.os.Message;
import android.speech.IRecognitionService;
import android.speech.RecognitionListener;
import android.speech.RecognitionSupport;
import android.speech.RecognitionSupportCallback;
import android.speech.SpeechRecognizer;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.google.common.base.Preconditions;
import java.util.Queue;
import java.util.concurrent.Executor;
import org.robolectric.annotation.Implementation;
Expand All @@ -30,7 +30,7 @@
import org.robolectric.util.reflector.Static;

/** Robolectric shadow for SpeechRecognizer. */
@Implements(SpeechRecognizer.class)
@Implements(value = SpeechRecognizer.class, looseSignatures = true)
public class ShadowSpeechRecognizer {

@RealObject SpeechRecognizer realSpeechRecognizer;
Expand All @@ -39,7 +39,7 @@ public class ShadowSpeechRecognizer {
private RecognitionListener recognitionListener;
private static boolean isOnDeviceRecognitionAvailable = true;

private RecognitionSupportCallback recognitionSupportCallback;
private /*RecognitionSupportCallback*/ Object recognitionSupportCallback;
private Executor recognitionSupportExecutor;
@Nullable private Intent latestModelDownloadIntent;

Expand Down Expand Up @@ -138,10 +138,17 @@ protected static boolean isOnDeviceRecognitionAvailable(final Context context) {
return isOnDeviceRecognitionAvailable;
}

@RequiresApi(api = VERSION_CODES.TIRAMISU)
@Implementation(minSdk = VERSION_CODES.TIRAMISU)
protected void checkRecognitionSupport(
Intent recognizerIntent, Executor executor, RecognitionSupportCallback supportListener) {
recognitionSupportExecutor = executor;
@NonNull /*Intent*/ Object recognizerIntent,
@NonNull /*Executor*/ Object executor,
@NonNull /*RecognitionSupportCallback*/ Object supportListener) {
Preconditions.checkArgument(recognizerIntent instanceof Intent);
Preconditions.checkArgument(executor instanceof Executor);
Preconditions.checkArgument(
supportListener instanceof android.speech.RecognitionSupportCallback);
recognitionSupportExecutor = (Executor) executor;
recognitionSupportCallback = supportListener;
}

Expand All @@ -155,14 +162,20 @@ public static void setIsOnDeviceRecognitionAvailable(boolean available) {
}

@RequiresApi(VERSION_CODES.TIRAMISU)
public void triggerSupportResult(RecognitionSupport recognitionSupport) {
public void triggerSupportResult(/*RecognitionSupport*/ Object recognitionSupport) {
Preconditions.checkArgument(recognitionSupport instanceof android.speech.RecognitionSupport);
recognitionSupportExecutor.execute(
() -> recognitionSupportCallback.onSupportResult(recognitionSupport));
() ->
((android.speech.RecognitionSupportCallback) recognitionSupportCallback)
.onSupportResult((android.speech.RecognitionSupport) recognitionSupport));
}

@RequiresApi(VERSION_CODES.TIRAMISU)
public void triggerSupportError(int error) {
recognitionSupportExecutor.execute(() -> recognitionSupportCallback.onError(error));
recognitionSupportExecutor.execute(
() ->
((android.speech.RecognitionSupportCallback) recognitionSupportCallback)
.onError(error));
}

@RequiresApi(VERSION_CODES.TIRAMISU)
Expand Down

0 comments on commit 0df34bf

Please sign in to comment.