Call listModules directly in STService

- Appropriately transmits error conditions to the caller
- Clean-up various call sites.

Test: Assistant/Now Playing attaches
Test: atest CtsVoiceInteractionTestCases
Bug: 273243648
Change-Id: I50c045ca2fa0798f61c17bcb05eeb4aaf7b474cf
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 70af337..04c1c04 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -44,6 +44,7 @@
 import android.content.pm.ResolveInfo;
 import android.hardware.soundtrigger.IRecognitionStatusCallback;
 import android.hardware.soundtrigger.ModelParams;
+import android.hardware.soundtrigger.ConversionUtil;
 import android.hardware.soundtrigger.SoundTrigger;
 import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
 import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
@@ -63,6 +64,7 @@
 import android.media.soundtrigger.ISoundTriggerDetectionService;
 import android.media.soundtrigger.ISoundTriggerDetectionServiceClient;
 import android.media.soundtrigger.SoundTriggerDetectionService;
+import android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
@@ -72,6 +74,8 @@
 import android.os.ParcelUuid;
 import android.os.PowerManager;
 import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.provider.Settings;
@@ -88,11 +92,13 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.TreeMap;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -215,14 +221,29 @@
         }
     }
 
+    // Must be called with cleared binder context.
+    private static List<ModuleProperties> listUnderlyingModuleProperties(
+            Identity originatorIdentity) {
+        Identity middlemanIdentity = new Identity();
+        middlemanIdentity.packageName = ActivityThread.currentOpPackageName();
+        var service = ISoundTriggerMiddlewareService.Stub.asInterface(
+                ServiceManager.waitForService(Context.SOUND_TRIGGER_MIDDLEWARE_SERVICE));
+        try {
+            return Arrays.stream(service.listModulesAsMiddleman(middlemanIdentity,
+                                                                originatorIdentity))
+                    .map(desc -> ConversionUtil.aidl2apiModuleDescriptor(desc))
+                    .collect(Collectors.toList());
+        } catch (RemoteException e) {
+            throw new ServiceSpecificException(SoundTrigger.STATUS_DEAD_OBJECT);
+        }
+    }
+
     private SoundTriggerHelper newSoundTriggerHelper(ModuleProperties moduleProperties) {
         Identity middlemanIdentity = new Identity();
         middlemanIdentity.packageName = ActivityThread.currentOpPackageName();
         Identity originatorIdentity = IdentityContext.getNonNull();
 
-        ArrayList<ModuleProperties> moduleList = new ArrayList<>();
-        SoundTrigger.listModulesAsMiddleman(moduleList, middlemanIdentity,
-                                        originatorIdentity);
+        List<ModuleProperties> moduleList = listUnderlyingModuleProperties(originatorIdentity);
 
         // Don't fail existing CTS tests which run without a ST module
         final int moduleId = (moduleProperties != null) ?
@@ -241,12 +262,8 @@
                                         moduleId, statusListener, null /* handler */,
                                         middlemanIdentity, originatorIdentity),
                 moduleId,
-                () -> {
-                    ArrayList<ModuleProperties> modulePropList = new ArrayList<>();
-                    SoundTrigger.listModulesAsMiddleman(modulePropList, middlemanIdentity,
-                                                    originatorIdentity);
-                    return modulePropList;
-                });
+                () -> listUnderlyingModuleProperties(originatorIdentity)
+                );
     }
 
     class SoundTriggerServiceStub extends ISoundTriggerService.Stub {
@@ -276,12 +293,7 @@
         public List<ModuleProperties> listModuleProperties(@NonNull Identity originatorIdentity) {
             try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
                     originatorIdentity)) {
-                Identity middlemanIdentity = new Identity();
-                middlemanIdentity.packageName = ActivityThread.currentOpPackageName();
-                ArrayList<ModuleProperties> moduleList = new ArrayList<>();
-                SoundTrigger.listModulesAsMiddleman(moduleList, middlemanIdentity,
-                                                originatorIdentity);
-                return moduleList;
+                return listUnderlyingModuleProperties(originatorIdentity);
             }
         }
     }
@@ -1647,17 +1659,10 @@
 
         @Override
         public List<ModuleProperties> listModuleProperties(Identity originatorIdentity) {
-            ArrayList<ModuleProperties> moduleList = new ArrayList<>();
             try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
                     originatorIdentity)) {
-                Identity middlemanIdentity = new Identity();
-                middlemanIdentity.uid = Binder.getCallingUid();
-                middlemanIdentity.pid = Binder.getCallingPid();
-                middlemanIdentity.packageName = ActivityThread.currentOpPackageName();
-                SoundTrigger.listModulesAsMiddleman(moduleList, middlemanIdentity,
-                                                originatorIdentity);
+                return listUnderlyingModuleProperties(originatorIdentity);
             }
-            return moduleList;
         }
 
         @Override