summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
author Hai Zhang <zhanghai@google.com> 2025-03-12 13:55:35 -0700
committer Hai Zhang <zhanghai@google.com> 2025-03-12 13:57:49 -0700
commit77784de2a03d958dd547358993f81ec445a7bcdd (patch)
treef416e6d10cd4ad266c8186de76918cef32fffadc /service
parentee7c1e91f62ad10bd4f601e60bb1c4b7c76f50af (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.java30
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);
}