diff options
Diffstat (limited to 'services/print/java')
-rw-r--r-- | services/print/java/com/android/server/print/PrintManagerService.java | 30 | ||||
-rw-r--r-- | services/print/java/com/android/server/print/UserState.java | 48 |
2 files changed, 63 insertions, 15 deletions
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 852736b..7f146a7 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -406,7 +406,6 @@ public final class PrintManagerService extends SystemService { private void registerContentObservers() { final Uri enabledPrintServicesUri = Settings.Secure.getUriFor( Settings.Secure.ENABLED_PRINT_SERVICES); - ContentObserver observer = new ContentObserver(BackgroundThread.getHandler()) { @Override public void onChange(boolean selfChange, Uri uri) { @@ -426,39 +425,42 @@ public final class PrintManagerService extends SystemService { private void registerBoradcastReceivers() { PackageMonitor monitor = new PackageMonitor() { @Override - public boolean onPackageChanged(String packageName, int uid, String[] components) { + public void onPackageModified(String packageName) { synchronized (mLock) { + boolean servicesChanged = false; UserState userState = getOrCreateUserStateLocked(getChangingUserId()); - Iterator<ComponentName> iterator = userState.getEnabledServices() - .iterator(); + Iterator<ComponentName> iterator = userState.getEnabledServices().iterator(); while (iterator.hasNext()) { ComponentName componentName = iterator.next(); if (packageName.equals(componentName.getPackageName())) { - userState.updateIfNeededLocked(); - return true; + servicesChanged = true; } } + if (servicesChanged) { + userState.updateIfNeededLocked(); + } } - return false; } @Override public void onPackageRemoved(String packageName, int uid) { synchronized (mLock) { + boolean servicesRemoved = false; UserState userState = getOrCreateUserStateLocked(getChangingUserId()); - Iterator<ComponentName> iterator = userState.getEnabledServices() - .iterator(); + 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/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index f23a992..f647814 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -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(); @@ -657,7 +660,33 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { tempPrintServices.add(PrintServiceInfo.create(installedService, mContext)); } - if (!tempPrintServices.equals(mInstalledServices)) { + boolean someServiceChanged = false; + + if (tempPrintServices.size() != mInstalledServices.size()) { + someServiceChanged = true; + } else { + for (PrintServiceInfo newService: tempPrintServices) { + final int oldServiceIndex = mInstalledServices.indexOf(newService); + if (oldServiceIndex < 0) { + someServiceChanged = true; + break; + } + // PrintServiceInfo#equals compares only the id not all members, + // so we are also comparing the members coming from meta-data. + PrintServiceInfo oldService = mInstalledServices.get(oldServiceIndex); + if (!TextUtils.equals(oldService.getAddPrintersActivityName(), + newService.getAddPrintersActivityName()) + || !TextUtils.equals(oldService.getAdvancedOptionsActivityName(), + newService.getAdvancedOptionsActivityName()) + || !TextUtils.equals(oldService.getSettingsActivityName(), + newService.getSettingsActivityName())) { + someServiceChanged = true; + break; + } + } + } + + if (someServiceChanged) { mInstalledServices.clear(); mInstalledServices.addAll(tempPrintServices); return true; @@ -761,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( @@ -779,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) { |