From 468d4e8dc21b179a846ae8abc7dec5ea80944c16 Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Thu, 15 Dec 2022 01:09:10 +0000 Subject: [PATCH] Fix update of services for multiple backend mode Test: manual Bug: 256010531 Change-Id: I5650576e856009bde620c76577f5932e41b22e8e --- .../infra/AbstractMasterSystemService.java | 22 +++++++++++++++ .../infra/AbstractPerUserSystemService.java | 28 +++++++------------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java index b813995f1c087..1395d685eeb7d 100644 --- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java @@ -684,6 +684,15 @@ public abstract class AbstractMasterSystemService updateCachedServiceListLocked(@UserIdInt int userId, boolean disabled) { + if (mServiceNameResolver.isConfiguredInMultipleMode()) { + // In multiple mode, we have multiple instances of AbstractPerUserSystemService, per + // user where each instance holds information needed to connect to a backend. An + // update operation in this mode needs to account for addition, deletion, change + // of backends and cannot be executed in the scope of a given + // AbstractPerUserSystemService. + return updateCachedServiceListMultiModeLocked(userId, disabled); + } + // isConfiguredInMultipleMode is false final List services = getServiceListForUserLocked(userId); if (services == null) { return null; @@ -704,6 +713,19 @@ public abstract class AbstractMasterSystemService updateCachedServiceListMultiModeLocked(int userId, boolean disabled) { + final int resolvedUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), + Binder.getCallingUid(), userId, false, false, null, + null); + List services = new ArrayList<>(); + synchronized (mLock) { + removeCachedServiceListLocked(resolvedUserId); + services = getServiceListForUserLocked(userId); + } + return services; + } + /** * Gets the Settings property that defines the name of the component name used to bind this * service to an external service, or {@code null} when the service is not defined by such diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java index b8f1db402a555..d4a29c7f1b62e 100644 --- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java @@ -154,7 +154,14 @@ public abstract class AbstractPerUserSystemService