diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 395062e17b941..491a5cda2950e 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -8402,6 +8402,12 @@ public class AudioManager { * {@link #addAssistantServicesUids(int[])} and not yet removed with * {@link #removeAssistantServicesUids(int[])} * + *
Note that during native audioserver crash and after boot up the list of assistant + * UIDs will be reset to an empty list (i.e. no UID will be considered as assistant) + * Just after user switch, the list of assistant will also reset to empty. + * In both cases,The component's UID of the assistiant role or assistant setting will be + * automitically added to the list by the audio service. + * * @return array of assistants UIDs * * @hide diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 5aae319662666..d7755810f37bc 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1368,14 +1368,18 @@ public class AudioService extends IAudioService.Stub mRm = (RoleManager) mContext.getSystemService(Context.ROLE_SERVICE); if (mRm != null) { mRm.addOnRoleHoldersChangedListenerAsUser(mExecutor, this, UserHandle.ALL); - updateAssistantUId(true); + synchronized (mSettingsLock) { + updateAssistantUIdLocked(/* forceUpdate= */ true); + } } } @Override public void onRoleHoldersChanged(@NonNull String roleName, @NonNull UserHandle user) { if (RoleManager.ROLE_ASSISTANT.equals(roleName)) { - updateAssistantUId(false); + synchronized (mSettingsLock) { + updateAssistantUIdLocked(/* forceUpdate= */ false); + } } } @@ -1474,7 +1478,7 @@ public class AudioService extends IAudioService.Stub sendEncodedSurroundMode(mContentResolver, "onAudioServerDied"); sendEnabledSurroundFormats(mContentResolver, true); AudioSystem.setRttEnabled(mRttEnabled); - updateAssistantServicesUidsLocked(); + resetAssistantServicesUidsLocked(); } synchronized (mAccessibilityServiceUidsLock) { @@ -1602,6 +1606,12 @@ public class AudioService extends IAudioService.Stub } } + @GuardedBy("mSettingsLock") + private void resetAssistantServicesUidsLocked() { + mAssistantUids.clear(); + updateAssistantUIdLocked(/* forceUpdate= */ true); + } + @GuardedBy("mSettingsLock") private void updateAssistantServicesUidsLocked() { int[] assistantUids = mAssistantUids.stream().mapToInt(Integer::intValue).toArray(); @@ -2386,7 +2396,7 @@ public class AudioService extends IAudioService.Stub } @GuardedBy("mSettingsLock") - private void updateAssistantUId(boolean forceUpdate) { + private void updateAssistantUIdLocked(boolean forceUpdate) { int assistantUid = INVALID_UID; // Consider assistants in the following order of priority: // 1) apk in assistant role @@ -2484,7 +2494,7 @@ public class AudioService extends IAudioService.Stub readDockAudioSettings(cr); sendEncodedSurroundMode(cr, "readPersistedSettings"); sendEnabledSurroundFormats(cr, true); - updateAssistantUId(true); + updateAssistantUIdLocked(/* forceUpdate= */ true); resetActiveAssistantUidsLocked(); AudioSystem.setRttEnabled(mRttEnabled); } @@ -8317,7 +8327,7 @@ public class AudioService extends IAudioService.Stub updateMasterBalance(mContentResolver); updateEncodedSurroundOutput(); sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged); - updateAssistantUId(false); + updateAssistantUIdLocked(/* forceUpdate= */ false); } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index d527a230a97b0..c86f38d4264de 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -679,6 +679,7 @@ final class HotwordDetectionConnection { private void restartProcessLocked() { Slog.v(TAG, "Restarting hotword detection process"); ServiceConnection oldConnection = mRemoteHotwordDetectionService; + HotwordDetectionServiceIdentity previousIdentity = mIdentity; // TODO(volnov): this can be done after connect() has been successful. if (mValidatingDspTrigger) { @@ -722,6 +723,9 @@ final class HotwordDetectionConnection { } oldConnection.ignoreConnectionStatusEvents(); oldConnection.unbind(); + if (previousIdentity != null) { + removeServiceUidForAudioPolicy(previousIdentity.getIsolatedUid()); + } } static final class SoundTriggerCallback extends IRecognitionStatusCallback.Stub {