diff options
author | 2025-03-12 13:55:35 -0700 | |
---|---|---|
committer | 2025-03-12 13:57:49 -0700 | |
commit | 77784de2a03d958dd547358993f81ec445a7bcdd (patch) | |
tree | f416e6d10cd4ad266c8186de76918cef32fffadc /service | |
parent | ee7c1e91f62ad10bd4f601e60bb1c4b7c76f50af (diff) |
Work around force stop issue for assistant role
Work around VoiceInteractionManagerService resetting default assistant
upon force stop by ignoring its call to clearRoleHoldersAsUser(), and
announce a role holder change instead to trigger re-configuring the
default assistant.
Bug: 191743558
Flag: EXEMPT bugfix
Test: manually force stop a current downloaded assistant with VIS and
make sure it is still the default assistant and usable
Relnote: N/A
Change-Id: Ibd36cd8c1fb86059301951b7be0d43942cac7ed6
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/role/RoleService.java | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/service/java/com/android/role/RoleService.java b/service/java/com/android/role/RoleService.java index ac6703545..529b0cbdf 100644 --- a/service/java/com/android/role/RoleService.java +++ b/service/java/com/android/role/RoleService.java @@ -40,6 +40,7 @@ import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -726,6 +727,35 @@ public class RoleService extends SystemService implements RoleUserState.Callback Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); Objects.requireNonNull(callback, "callback cannot be null"); + // Work around VoiceInteractionManagerService resetting default assistant upon force + // stop on pre-V platforms (b/191743558). + if (!SdkLevel.isAtLeastV() && Objects.equals(roleName, RoleManager.ROLE_ASSISTANT) + && Binder.getCallingUid() == Process.myUid()) { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + boolean isCallFromForceStop = false; + for (StackTraceElement stackTraceElement : stackTraceElements) { + if (stackTraceElement.getClassName().contains( + "com.android.server.voiceinteraction.VoiceInteractionManagerService") + && stackTraceElement.getMethodName().equals("onHandleForceStop")) { + isCallFromForceStop = true; + break; + } + } + if (isCallFromForceStop) { + Log.i(LOG_TAG, "Ignoring clearRoleHoldersAsUser() call from" + + " VoiceInteractionManagerService due to force stopping the current" + + " assistant"); + ForegroundThread.getHandler().post(() -> { + // Notify the callback as if this call has failed for some reason. + callback.sendResult(null); + // Announce a role holder change to trigger the default assistant to be + // re-configured in VoiceInteractionManagerService. + onRoleHoldersChanged(roleName, userId); + }); + return; + } + } + getOrCreateController(userId).onClearRoleHolders(roleName, flags, callback); } |