Fix update of services for multiple backend mode

Test: manual
Bug: 256010531
Change-Id: I5650576e856009bde620c76577f5932e41b22e8e
This commit is contained in:
Reema Bajwa
2022-12-15 01:09:10 +00:00
parent 9a512e9c88
commit 468d4e8dc2
2 changed files with 32 additions and 18 deletions

View File

@@ -684,6 +684,15 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
*/
@GuardedBy("mLock")
protected List<S> 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<S> services = getServiceListForUserLocked(userId);
if (services == null) {
return null;
@@ -704,6 +713,19 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
return services;
}
@GuardedBy("mLock")
private List<S> updateCachedServiceListMultiModeLocked(int userId, boolean disabled) {
final int resolvedUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
Binder.getCallingUid(), userId, false, false, null,
null);
List<S> 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

View File

@@ -154,7 +154,14 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst
if (mMaster.mServiceNameResolver != null
&& mMaster.mServiceNameResolver.isConfiguredInMultipleMode()) {
updateServiceInfoListLocked();
// Update of multi configured mode should always happen in AbstractMasterSystemService
// as this class is not aware of the complete list of multiple backends. Since we
// should never end up in this state, it is safe to not do anything if we end up here
// through a different code path.
if (mMaster.debug) {
Slog.d(mTag, "Should not end up in updateLocked when "
+ "isConfiguredInMultipleMode is true");
}
} else {
updateServiceInfoLocked();
}
@@ -166,29 +173,14 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst
*/
@GuardedBy("mLock")
protected final ComponentName updateServiceInfoLocked() {
ComponentName[] componentNames = updateServiceInfoListLocked();
return componentNames == null || componentNames.length == 0 ? null : componentNames[0];
}
/**
* Updates the internal reference to the service info, and returns the service's component.
*/
@GuardedBy("mLock")
protected final ComponentName[] updateServiceInfoListLocked() {
if (mMaster.mServiceNameResolver == null) {
return null;
}
if (!mMaster.mServiceNameResolver.isConfiguredInMultipleMode()) {
final String componentName = getComponentNameLocked();
return new ComponentName[] { getServiceComponent(componentName) };
return getServiceComponent(componentName);
}
final String[] componentNames = mMaster.mServiceNameResolver.getServiceNameList(
mUserId);
ComponentName[] serviceComponents = new ComponentName[componentNames.length];
for (int i = 0; i < componentNames.length; i++) {
serviceComponents[i] = getServiceComponent(componentNames[i]);
}
return serviceComponents;
return null;
}
private ComponentName getServiceComponent(String componentName) {