diff --git a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java index a1d74df56c522..37c5213e0359a 100644 --- a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java +++ b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java @@ -61,36 +61,42 @@ public class SoundTriggerModule { * This variant is intended for use when the caller is acting an originator, rather than on * behalf of a different entity, as far as authorization goes. */ - SoundTriggerModule(@NonNull ISoundTriggerMiddlewareService service, + public SoundTriggerModule(@NonNull ISoundTriggerMiddlewareService service, int moduleId, @NonNull SoundTrigger.StatusListener listener, @NonNull Looper looper, - @NonNull Identity originatorIdentity) - throws RemoteException { + @NonNull Identity originatorIdentity) { mId = moduleId; mEventHandlerDelegate = new EventHandlerDelegate(listener, looper); - - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - mService = service.attachAsOriginator(moduleId, originatorIdentity, - mEventHandlerDelegate); + try { + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + mService = service.attachAsOriginator(moduleId, originatorIdentity, + mEventHandlerDelegate); + } + mService.asBinder().linkToDeath(mEventHandlerDelegate, 0); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - mService.asBinder().linkToDeath(mEventHandlerDelegate, 0); } /** * This variant is intended for use when the caller is acting as a middleman, i.e. on behalf of * a different entity, as far as authorization goes. */ - SoundTriggerModule(@NonNull ISoundTriggerMiddlewareService service, + public SoundTriggerModule(@NonNull ISoundTriggerMiddlewareService service, int moduleId, @NonNull SoundTrigger.StatusListener listener, @NonNull Looper looper, - @NonNull Identity middlemanIdentity, @NonNull Identity originatorIdentity) - throws RemoteException { + @NonNull Identity middlemanIdentity, @NonNull Identity originatorIdentity) { mId = moduleId; mEventHandlerDelegate = new EventHandlerDelegate(listener, looper); - try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { - mService = service.attachAsMiddleman(moduleId, middlemanIdentity, originatorIdentity, - mEventHandlerDelegate); + try { + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { + mService = service.attachAsMiddleman(moduleId, middlemanIdentity, + originatorIdentity, + mEventHandlerDelegate); + } + mService.asBinder().linkToDeath(mEventHandlerDelegate, 0); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - mService.asBinder().linkToDeath(mEventHandlerDelegate, 0); } @Override diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index bee75dfe785f8..255db1e4db831 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java @@ -1043,7 +1043,13 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { internalClearGlobalStateLocked(); if (mModule != null) { mModule.detach(); - mModule = mModuleProvider.apply(this); + try { + // This is best effort + // TODO (b/279507851) + mModule = mModuleProvider.apply(this); + } catch (Exception e) { + mModule = null; + } } } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 77e53177e6a81..b062e6b08e002 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -57,6 +57,7 @@ import android.hardware.soundtrigger.SoundTrigger.ModelParamRange; import android.hardware.soundtrigger.SoundTrigger.ModuleProperties; import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig; import android.hardware.soundtrigger.SoundTrigger.SoundModel; +import android.hardware.soundtrigger.SoundTriggerModule; import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioRecord; @@ -134,6 +135,8 @@ public class SoundTriggerService extends SystemService { private Object mLock; private final SoundTriggerServiceStub mServiceStub; private final LocalSoundTriggerService mLocalSoundTriggerService; + + private ISoundTriggerMiddlewareService mMiddlewareService; private SoundTriggerDbHelper mDbHelper; private final EventLogger mServiceEventLogger = new EventLogger(256, "Service"); @@ -241,17 +244,18 @@ public class SoundTriggerService extends SystemService { if (PHASE_THIRD_PARTY_APPS_CAN_START == phase) { mDbHelper = new SoundTriggerDbHelper(mContext); } + mMiddlewareService = ISoundTriggerMiddlewareService.Stub.asInterface( + ServiceManager.waitForService(Context.SOUND_TRIGGER_MIDDLEWARE_SERVICE)); + } // Must be called with cleared binder context. - private static List listUnderlyingModuleProperties( + private List 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, + return Arrays.stream(mMiddlewareService.listModulesAsMiddleman(middlemanIdentity, originatorIdentity)) .map(desc -> ConversionUtil.aidl2apiModuleDescriptor(desc)) .collect(Collectors.toList()); @@ -282,10 +286,9 @@ public class SoundTriggerService extends SystemService { return new SoundTriggerHelper( mContext, eventLogger, - (SoundTrigger.StatusListener statusListener) -> - SoundTrigger.attachModuleAsMiddleman( - moduleId, statusListener, null /* handler */, - middlemanIdentity, originatorIdentity), + (SoundTrigger.StatusListener statusListener) -> new SoundTriggerModule( + mMiddlewareService, moduleId, statusListener, + Looper.getMainLooper(), middlemanIdentity, originatorIdentity), moduleId, () -> listUnderlyingModuleProperties(originatorIdentity) );