From 42b0291dabf6ec7ba857f8d9a339e106bb4d2487 Mon Sep 17 00:00:00 2001 From: Atneya Nair Date: Thu, 2 Mar 2023 16:29:03 -0800 Subject: [PATCH] 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 --- .../android/hardware/soundtrigger/SoundTrigger.java | 5 +++++ .../service/voice/AlwaysOnHotwordDetector.java | 12 +++++++----- .../media/soundtrigger/SoundTriggerManager.java | 13 +++++++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index e63f57b5224cf..55939896ab986 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -78,6 +78,11 @@ public class SoundTrigger { private SoundTrigger() { } + /** + * @hide + */ + public static final String FAKE_HAL_ARCH = "injection"; + /** * Status code used when the operation succeeded */ diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index b1dc686059914..2830fb7750e42 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -805,11 +805,13 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { Identity identity = new Identity(); identity.packageName = ActivityThread.currentOpPackageName(); if (moduleProperties == null) { - List 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 0e9ef4c0c8ddb..ae8121a59abf3 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerManager.java +++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java @@ -94,12 +94,17 @@ public final class SoundTriggerManager { originatorIdentity.packageName = ActivityThread.currentOpPackageName(); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - List 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;