summaryrefslogtreecommitdiffstats
path: root/services/print/java
diff options
context:
space:
mode:
Diffstat (limited to 'services/print/java')
-rw-r--r--services/print/java/com/android/server/print/PrintManagerService.java30
-rw-r--r--services/print/java/com/android/server/print/UserState.java48
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) {