Print service meta-data changes not handled properly.
The package monitor in the PrintManagerService was not overriding
the correct callback to capture changes in the print service package
including meta-data. Hence, there was a missed signal the the old
meta-data was used.
The implication is that if a vendor adds new feature such as custom
print options activity or print service settings that were not there
before, then they will not be show until the device reboots.
bug:11772977
Change-Id: Idf756c430f30ae6d16760a257c199a72a52cf5c5
diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java
index 98acc27..a475639 100644
--- a/services/java/com/android/server/print/PrintManagerService.java
+++ b/services/java/com/android/server/print/PrintManagerService.java
@@ -399,7 +399,7 @@
private void registerBoradcastReceivers() {
PackageMonitor monitor = new PackageMonitor() {
@Override
- public boolean onPackageChanged(String packageName, int uid, String[] components) {
+ public void onPackageModified(String packageName) {
synchronized (mLock) {
UserState userState = getOrCreateUserStateLocked(getChangingUserId());
Iterator<ComponentName> iterator = userState.getEnabledServices().iterator();
@@ -407,11 +407,9 @@
ComponentName componentName = iterator.next();
if (packageName.equals(componentName.getPackageName())) {
userState.updateIfNeededLocked();
- return true;
}
}
}
- return false;
}
@Override
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index f23a992..43757f9 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -657,7 +657,33 @@
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;