Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 468d4e8d authored by Reema Bajwa's avatar Reema Bajwa
Browse files

Fix update of services for multiple backend mode

Test: manual
Bug: 256010531
Change-Id: I5650576e856009bde620c76577f5932e41b22e8e
parent 9a512e9c
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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
+10 −18
Original line number Diff line number Diff line
@@ -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) {