summaryrefslogtreecommitdiff
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
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
-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);
}