diff options
| author | 2016-03-07 15:27:05 -0800 | |
|---|---|---|
| committer | 2016-03-07 15:32:25 -0800 | |
| commit | 852c950bbfbfb10c6e05dc62dd2e662980238a46 (patch) | |
| tree | 9e4ee802dcfc868303eba309c3c45820924016a0 | |
| parent | e47b0d4fc215458c8795c1e014dee63e899a94c9 (diff) | |
Correct how to deal with print service installation
- Deal with case that there are currently no print services installed
- Deal with the case that a package modification adds a print service
Bug: 27530312
Change-Id: I67a647bd0982a092a4810d6c1285d0c7b64e104e
| -rw-r--r-- | services/print/java/com/android/server/print/PrintManagerService.java | 106 |
1 files changed, 65 insertions, 41 deletions
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 42b4f64366ba..8cfc4a3ee8e0 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -612,45 +612,79 @@ public final class PrintManagerService extends SystemService { private void registerBroadcastReceivers() { PackageMonitor monitor = new PackageMonitor() { - private void updateServices(String packageName) { - if (!mUserManager.isUserUnlocked(getChangingUserId())) return; - synchronized (mLock) { - // A background user/profile's print jobs are running but there is - // no UI shown. Hence, if the packages of such a user change we need - // to handle it as the change may affect ongoing print jobs. - boolean servicesChanged = false; - UserState userState = getOrCreateUserStateLocked(getChangingUserId()); + /** + * Checks if the package contains a print service. + * + * @param packageName The name of the package + * + * @return true iff the package contains a print service + */ + private boolean hasPrintService(String packageName) { + Intent intent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE); + intent.setPackage(packageName); - List<PrintServiceInfo> installedServices = userState - .getPrintServices(PrintManager.ALL_SERVICES); - if (installedServices != null) { - final int numInstalledServices = installedServices.size(); - for (int i = 0; i < numInstalledServices; i++) { - if (installedServices.get(i).getResolveInfo() - .serviceInfo.packageName.equals(packageName)) { - servicesChanged = true; - break; - } - } - if (servicesChanged) { - userState.updateIfNeededLocked(); - } + List<ResolveInfo> installedServices = mContext.getPackageManager() + .queryIntentServicesAsUser(intent, + GET_SERVICES | MATCH_DEBUG_TRIAGED_MISSING, + getChangingUserId()); + + return installedServices != null && !installedServices.isEmpty(); + } + + /** + * Checks if there is a print service currently registered for this package. + * + * @param userState The userstate for the current user + * @param packageName The name of the package + * + * @return true iff the package contained (and might still contain) a print service + */ + private boolean hadPrintService(@NonNull UserState userState, String packageName) { + List<PrintServiceInfo> installedServices = userState + .getPrintServices(PrintManager.ALL_SERVICES); + + if (installedServices == null) { + return false; + } + + final int numInstalledServices = installedServices.size(); + for (int i = 0; i < numInstalledServices; i++) { + if (installedServices.get(i).getResolveInfo().serviceInfo.packageName + .equals(packageName)) { + return true; } } + + return false; } @Override public void onPackageModified(String packageName) { if (!mUserManager.isUserUnlocked(getChangingUserId())) return; - updateServices(packageName); - getOrCreateUserStateLocked(getChangingUserId()).prunePrintServices(); + UserState userState = getOrCreateUserStateLocked(getChangingUserId()); + + synchronized (mLock) { + if (hadPrintService(userState, packageName) + || hasPrintService(packageName)) { + userState.updateIfNeededLocked(); + } + } + + userState.prunePrintServices(); } @Override public void onPackageRemoved(String packageName, int uid) { if (!mUserManager.isUserUnlocked(getChangingUserId())) return; - updateServices(packageName); - getOrCreateUserStateLocked(getChangingUserId()).prunePrintServices(); + UserState userState = getOrCreateUserStateLocked(getChangingUserId()); + + synchronized (mLock) { + if (hadPrintService(userState, packageName)) { + userState.updateIfNeededLocked(); + } + } + + userState.prunePrintServices(); } @Override @@ -694,21 +728,11 @@ public final class PrintManagerService extends SystemService { @Override public void onPackageAdded(String packageName, int uid) { if (!mUserManager.isUserUnlocked(getChangingUserId())) return; - - // A background user/profile's print jobs are running but there is - // no UI shown. Hence, if the packages of such a user change we need - // to handle it as the change may affect ongoing print jobs. - Intent intent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE); - intent.setPackage(packageName); - - List<ResolveInfo> installedServices = mContext.getPackageManager() - .queryIntentServicesAsUser(intent, - GET_SERVICES | MATCH_DEBUG_TRIAGED_MISSING, - getChangingUserId()); - - if (installedServices != null) { - UserState userState = getOrCreateUserStateLocked(getChangingUserId()); - userState.updateIfNeededLocked(); + synchronized (mLock) { + if (hasPrintService(packageName)) { + UserState userState = getOrCreateUserStateLocked(getChangingUserId()); + userState.updateIfNeededLocked(); + } } } }; |