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

Commit dbcc95d4 authored by Svetoslav's avatar Svetoslav
Browse files

Removed print services not fully cleaned up.

1. When a print services is removed it is removed from the
   installed and enabled services but not from the active
   ones while it should.

2. If a package has more than one print service (very rare
   but possible) we are executing the "make everything right"
   code for each of them which is not very optimal.

Change-Id: I7f6fc4eef10b6757d3b2ede33eb298c3399c3ff7
parent 1732f263
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -401,13 +401,17 @@ public final class PrintManagerService extends IPrintManager.Stub {
            @Override
            public void onPackageModified(String packageName) {
                synchronized (mLock) {
                    boolean servicesChanged = false;
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                    Iterator<ComponentName> iterator = userState.getEnabledServices().iterator();
                    while (iterator.hasNext()) {
                        ComponentName componentName = iterator.next();
                        if (packageName.equals(componentName.getPackageName())) {
                            userState.updateIfNeededLocked();
                            servicesChanged = true;
                        }
                    }
                    if (servicesChanged) {
                        userState.updateIfNeededLocked();
                    }
                }
            }
@@ -415,18 +419,21 @@ public final class PrintManagerService extends IPrintManager.Stub {
            @Override
            public void onPackageRemoved(String packageName, int uid) {
                synchronized (mLock) {
                    boolean servicesRemoved = false;
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                    Iterator<ComponentName> iterator = userState.getEnabledServices().iterator();
                    while (iterator.hasNext()) {
                        ComponentName componentName = iterator.next();
                        if (packageName.equals(componentName.getPackageName())) {
                            iterator.remove();
                            servicesRemoved = true;
                        }
                    }
                    if (servicesRemoved) {
                        persistComponentNamesToSettingLocked(
                                Settings.Secure.ENABLED_PRINT_SERVICES,
                                userState.getEnabledServices(), getChangingUserId());
                        userState.updateIfNeededLocked();
                            return;
                        }
                    }
                }
            }
+20 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
@@ -594,6 +595,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
                    .append(installedService.getSettingsActivityName()).println();
            pw.append(installedServicePrefix).append(tab).append("addPrintersActivity=")
                    .append(installedService.getAddPrintersActivityName()).println();
            pw.append(installedServicePrefix).append(tab).append("avancedOptionsActivity=")
                   .append(installedService.getAdvancedOptionsActivityName()).println();
        }

        pw.append(prefix).append(tab).append("enabled services:").println();
@@ -787,11 +790,16 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
    }

    private void onConfigurationChangedLocked() {
        Set<ComponentName> installedComponents = new ArraySet<ComponentName>();

        final int installedCount = mInstalledServices.size();
        for (int i = 0; i < installedCount; i++) {
            ResolveInfo resolveInfo = mInstalledServices.get(i).getResolveInfo();
            ComponentName serviceName = new ComponentName(resolveInfo.serviceInfo.packageName,
                    resolveInfo.serviceInfo.name);

            installedComponents.add(serviceName);

            if (mEnabledServices.contains(serviceName)) {
                if (!mActiveServices.containsKey(serviceName)) {
                    RemotePrintService service = new RemotePrintService(
@@ -805,6 +813,18 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
                }
            }
        }

        Iterator<Map.Entry<ComponentName, RemotePrintService>> iterator =
                mActiveServices.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<ComponentName, RemotePrintService> entry = iterator.next();
            ComponentName serviceName = entry.getKey();
            RemotePrintService service = entry.getValue();
            if (!installedComponents.contains(serviceName)) {
                removeServiceLocked(service);
                iterator.remove();
            }
        }
    }

    private void addServiceLocked(RemotePrintService service) {