Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 852c950b authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

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
parent e47b0d4f
Loading
Loading
Loading
Loading
+65 −41
Original line number Diff line number Diff line
@@ -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<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) {

                    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)) {
                                    servicesChanged = true;
                                    break;
                                }
                            }
                            if (servicesChanged) {
                                userState.updateIfNeededLocked();
                            }
                        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,23 +728,13 @@ 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) {
                    synchronized (mLock) {
                        if (hasPrintService(packageName)) {
                            UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                            userState.updateIfNeededLocked();
                        }
                    }
                }
            };

            // package changes