Prevent ST clients from auto-attach to fake HAL

The current behavior is to pick the first ST module.
Right now, on devices with no HAL, clients use the fact
that the module fails to attach to detect lack of DSP presence.
We must retain this behavior when we add a second ST module
for testing, which is available on all devices.
Only select HALs not implemented by android for default construction.

Test: NowPlaying/HeyG attach verification
Test: When fake STHAL is added, NowPlaying/HeyG do NOT attach to it
Test: When real STHAL disabled, same as above
Test: getDspModuleProperties/getModuleProperties returns null on no real HAL
Bug: 271345481
Change-Id: Ie739eef56c4dedc2f7a79ec49f35793c95ca1658
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index e63f57b..5593989 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -79,6 +79,11 @@
     }
 
     /**
+     * @hide
+     */
+    public static final String FAKE_HAL_ARCH = "injection";
+
+    /**
      * Status code used when the operation succeeded
      */
     public static final int STATUS_OK = 0;
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index b1dc686..2830fb7 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -805,11 +805,13 @@
             Identity identity = new Identity();
             identity.packageName = ActivityThread.currentOpPackageName();
             if (moduleProperties == null) {
-                List<SoundTrigger.ModuleProperties> modulePropList =
-                        mModelManagementService.listModuleProperties(identity);
-                if (modulePropList.size() > 0) {
-                    moduleProperties = modulePropList.get(0);
-                }
+                moduleProperties = mModelManagementService
+                        .listModuleProperties(identity)
+                        .stream()
+                        .filter(prop -> !prop.getSupportedModelArch()
+                                .equals(SoundTrigger.FAKE_HAL_ARCH))
+                        .findFirst()
+                        .orElse(null);
                 // (@atneya) intentionally let a null moduleProperties through until
                 // all CTS tests are fixed
             }
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index 0e9ef4c..ae8121a 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -94,12 +94,17 @@
             originatorIdentity.packageName = ActivityThread.currentOpPackageName();
 
             try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
-                List<ModuleProperties> modulePropertiesList = soundTriggerService
-                        .listModuleProperties(originatorIdentity);
-                if (!modulePropertiesList.isEmpty()) {
+                ModuleProperties moduleProperties = soundTriggerService
+                        .listModuleProperties(originatorIdentity)
+                        .stream()
+                        .filter(prop -> !prop.getSupportedModelArch()
+                                .equals(SoundTrigger.FAKE_HAL_ARCH))
+                        .findFirst()
+                        .orElse(null);
+                if (moduleProperties != null) {
                     mSoundTriggerSession = soundTriggerService.attachAsOriginator(
                                                 originatorIdentity,
-                                                modulePropertiesList.get(0),
+                                                moduleProperties,
                                                 mBinderToken);
                 } else {
                     mSoundTriggerSession = null;