Fix update of services for multiple backend mode
Test: manual Bug: 256010531 Change-Id: I5650576e856009bde620c76577f5932e41b22e8e
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user