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
This commit is contained in:
Philip P. Moltmann
2016-03-07 15:27:05 -08:00
parent e47b0d4fc2
commit 852c950bbf

View File

@@ -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();
}
}
}
};