Allow Generic SoundTrigger Models

BUG: 22860713
Change-Id: Ic260af0831f9751ced161820f52f0b0185bdfcea
diff --git a/core/jni/android_hardware_SoundTrigger.cpp b/core/jni/android_hardware_SoundTrigger.cpp
index 048b3c7..793d132 100644
--- a/core/jni/android_hardware_SoundTrigger.cpp
+++ b/core/jni/android_hardware_SoundTrigger.cpp
@@ -68,6 +68,10 @@
     jfieldID    data;
 } gSoundModelFields;
 
+static const char* const kGenericSoundModelClassPathName =
+                                     "android/hardware/soundtrigger/SoundTrigger$GenericSoundModel";
+static jclass gGenericSoundModelClass;
+
 static const char* const kKeyphraseClassPathName =
                                      "android/hardware/soundtrigger/SoundTrigger$Keyphrase";
 static jclass gKeyphraseClass;
@@ -105,6 +109,11 @@
 static jclass gKeyphraseRecognitionEventClass;
 static jmethodID   gKeyphraseRecognitionEventCstor;
 
+static const char* const kGenericRecognitionEventClassPathName =
+                             "android/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent";
+static jclass gGenericRecognitionEventClass;
+static jmethodID   gGenericRecognitionEventCstor;
+
 static const char* const kKeyphraseRecognitionExtraClassPathName =
                              "android/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra";
 static jclass gKeyphraseRecognitionExtraClass;
@@ -266,6 +275,12 @@
                                 event->capture_preamble_ms, event->trigger_in_data,
                                 jAudioFormat, jData, jExtras);
         env->DeleteLocalRef(jExtras);
+    } else if (event->type == SOUND_MODEL_TYPE_GENERIC) {
+        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);
     } else {
         jEvent = env->NewObject(gRecognitionEventClass, gRecognitionEventCstor,
                                 event->status, event->model, event->capture_available,
@@ -524,6 +539,9 @@
     if (env->IsInstanceOf(jSoundModel, gKeyphraseSoundModelClass)) {
         offset = sizeof(struct sound_trigger_phrase_sound_model);
         type = SOUND_MODEL_TYPE_KEYPHRASE;
+    } else if (env->IsInstanceOf(jSoundModel, gGenericSoundModelClass)) {
+        offset = sizeof(struct sound_trigger_generic_sound_model);
+        type = SOUND_MODEL_TYPE_GENERIC;
     } else {
         offset = sizeof(struct sound_trigger_sound_model);
         type = SOUND_MODEL_TYPE_UNKNOWN;
@@ -631,6 +649,8 @@
             env->DeleteLocalRef(jPhrase);
         }
         env->DeleteLocalRef(jPhrases);
+    } else if (type == SOUND_MODEL_TYPE_GENERIC) {
+        /* No initialization needed */
     }
     status = module->loadSoundModel(memory, &handle);
     ALOGV("loadSoundModel status %d handle %d", status, handle);
@@ -831,6 +851,9 @@
                                                    "Ljava/util/UUID;");
     gSoundModelFields.data = GetFieldIDOrDie(env, soundModelClass, "data", "[B");
 
+    jclass genericSoundModelClass = FindClassOrDie(env, kGenericSoundModelClassPathName);
+    gGenericSoundModelClass = MakeGlobalRefOrDie(env, genericSoundModelClass);
+
     jclass keyphraseClass = FindClassOrDie(env, kKeyphraseClassPathName);
     gKeyphraseClass = MakeGlobalRefOrDie(env, keyphraseClass);
     gKeyphraseFields.id = GetFieldIDOrDie(env, keyphraseClass, "id", "I");
@@ -857,6 +880,11 @@
     gKeyphraseRecognitionEventCstor = GetMethodIDOrDie(env, keyphraseRecognitionEventClass, "<init>",
               "(IIZIIIZLandroid/media/AudioFormat;[B[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;)V");
 
+    jclass genericRecognitionEventClass = FindClassOrDie(env,
+                                                           kGenericRecognitionEventClassPathName);
+    gGenericRecognitionEventClass = MakeGlobalRefOrDie(env, genericRecognitionEventClass);
+    gGenericRecognitionEventCstor = GetMethodIDOrDie(env, genericRecognitionEventClass, "<init>",
+                                              "(IIZIIIZLandroid/media/AudioFormat;[B)V");
 
     jclass keyRecognitionConfigClass = FindClassOrDie(env, kRecognitionConfigClassPathName);
     gRecognitionConfigClass = MakeGlobalRefOrDie(env, keyRecognitionConfigClass);