Converting sound trigger v2.2 getModelState to be asynchronous

Test: built android with checkbuild flag

Change-Id: I4c6f2388c93b6e577113fc7f2cd19242628ee50f
Bug-Id: 70206501
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 007f4bc..dc4f0b7 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -611,6 +611,13 @@
      * @hide
      */
     public static final int RECOGNITION_STATUS_FAILURE = 2;
+    /**
+     * Recognition event was triggered by a getModelState request, not by the
+     * DSP.
+     *
+     * @hide
+     */
+    public static final int RECOGNITION_STATUS_GET_STATE_RESPONSE = 3;
 
     /**
      *  A RecognitionEvent is provided by the
diff --git a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
index e970747..402c228 100644
--- a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
+++ b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
@@ -133,12 +133,21 @@
     public native int stopRecognition(int soundModelHandle);
 
     /**
-     * Get the current state of a {@link SoundTrigger.SoundModel}
+     * Get the current state of a {@link SoundTrigger.SoundModel}.
+     * The state will be returned asynchronously as a {@link SoundTrigger#RecognitionEvent}
+     * in the callback registered in the {@link SoundTrigger.startRecognition} method.
      * @param soundModelHandle The sound model handle indicating which model's state to return
-     * @return - {@link SoundTrigger#RecognitionEvent} in case of success
-     *         - null in case of an error or if not supported
+     * @return - {@link SoundTrigger#STATUS_OK} in case of success
+     *         - {@link SoundTrigger#STATUS_ERROR} in case of unspecified error
+     *         - {@link SoundTrigger#STATUS_PERMISSION_DENIED} if the caller does not have
+     *         system permission
+     *         - {@link SoundTrigger#STATUS_NO_INIT} if the native service cannot be reached
+     *         - {@link SoundTrigger#STATUS_BAD_VALUE} if the sound model handle is invalid
+     *         - {@link SoundTrigger#STATUS_DEAD_OBJECT} if the binder transaction to the native
+     *         service fails
+     *         - {@link SoundTrigger#STATUS_INVALID_OPERATION} if the call is out of sequence
      */
-    public native SoundTrigger.RecognitionEvent getModelState(int soundModelHandle);
+    public native int getModelState(int soundModelHandle);
 
     private class NativeEventHandlerDelegate {
         private final Handler mHandler;
diff --git a/core/java/com/android/internal/app/ISoundTriggerService.aidl b/core/java/com/android/internal/app/ISoundTriggerService.aidl
index c0c689c..764c0cf 100644
--- a/core/java/com/android/internal/app/ISoundTriggerService.aidl
+++ b/core/java/com/android/internal/app/ISoundTriggerService.aidl
@@ -53,5 +53,5 @@
     /** For both ...Intent and ...Service based usage */
     boolean isRecognitionActive(in ParcelUuid parcelUuid);
 
-    SoundTrigger.RecognitionEvent getModelState(in ParcelUuid parcelUuid);
+    int getModelState(in ParcelUuid soundModelId);
 }
diff --git a/core/jni/android_hardware_SoundTrigger.cpp b/core/jni/android_hardware_SoundTrigger.cpp
index b417a56..98bc735 100644
--- a/core/jni/android_hardware_SoundTrigger.cpp
+++ b/core/jni/android_hardware_SoundTrigger.cpp
@@ -788,61 +788,18 @@
     return status;
 }
 
-static jobject
+static jint
 android_hardware_SoundTrigger_getModelState(JNIEnv *env, jobject thiz,
                                             jint jHandle)
 {
+    jint status = SOUNDTRIGGER_STATUS_OK;
     ALOGV("getModelState");
     sp<SoundTrigger> module = getSoundTrigger(env, thiz);
     if (module == NULL) {
-        return NULL;
+        return SOUNDTRIGGER_STATUS_ERROR;
     }
-    sp<IMemory> memory;
-    jint status = module->getModelState(jHandle, memory);
-    if (status != 0 || memory == NULL) {
-        ALOGW("getModelState, failed to get model state, status: %d", status);
-        return NULL;
-    }
-    struct sound_trigger_recognition_event* event =
-        (struct sound_trigger_recognition_event *)memory->pointer();
-    if (event == NULL) {
-        return NULL;
-    }
-    if (event->type != SOUND_MODEL_TYPE_GENERIC) {
-        ALOGW("getModelState, unsupported model type: %d", event->type);
-        return NULL;
-    }
-
-    jbyteArray jData = NULL;
-    if (event->data_size) {
-        jData = env->NewByteArray(event->data_size);
-        jbyte *nData = env->GetByteArrayElements(jData, NULL);
-        memcpy(nData, (char *)event + event->data_offset, event->data_size);
-        env->ReleaseByteArrayElements(jData, nData, 0);
-    }
-
-    jobject jAudioFormat = NULL;
-    if (event->trigger_in_data || event->capture_available) {
-        jAudioFormat = env->NewObject(gAudioFormatClass,
-                                      gAudioFormatCstor,
-                                      audioFormatFromNative(event->audio_config.format),
-                                      event->audio_config.sample_rate,
-                                      inChannelMaskFromNative(event->audio_config.channel_mask));
-
-    }
-    jobject jEvent = NULL;
-    jEvent = env->NewObject(gGenericRecognitionEventClass, gGenericRecognitionEventCstor,
-                            event->status, event->model, event->capture_available,
-                            event->capture_session, event->capture_delay_ms,
-                            event->capture_preamble_ms, event->trigger_in_data,
-                            jAudioFormat, jData);
-    if (jAudioFormat != NULL) {
-        env->DeleteLocalRef(jAudioFormat);
-    }
-    if (jData != NULL) {
-        env->DeleteLocalRef(jData);
-    }
-    return jEvent;
+    status = module->getModelState(jHandle);
+    return status;
 }
 
 static const JNINativeMethod gMethods[] = {
@@ -875,7 +832,7 @@
         "(I)I",
         (void *)android_hardware_SoundTrigger_stopRecognition},
     {"getModelState",
-        "(I)Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;",
+        "(I)I",
         (void *)android_hardware_SoundTrigger_getModelState},
 };