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
diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java
index a475639..e24fdb5 100644
--- a/services/java/com/android/server/print/PrintManagerService.java
+++ b/services/java/com/android/server/print/PrintManagerService.java
@@ -401,33 +401,40 @@
             @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();
+                    }
                 }
             }
 
             @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();
-                            persistComponentNamesToSettingLocked(
-                                    Settings.Secure.ENABLED_PRINT_SERVICES,
-                                    userState.getEnabledServices(), getChangingUserId());
-                            userState.updateIfNeededLocked();
-                            return;
+                            servicesRemoved = true;
                         }
                     }
+                    if (servicesRemoved) {
+                        persistComponentNamesToSettingLocked(
+                                Settings.Secure.ENABLED_PRINT_SERVICES,
+                                userState.getEnabledServices(), getChangingUserId());
+                        userState.updateIfNeededLocked();
+                    }
                 }
             }
 
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index 43757f9..f647814 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -71,6 +71,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -594,6 +595,8 @@
                     .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 @@
     }
 
     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 @@
                 }
             }
         }
+
+        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) {