diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index 07cc9c05f57a8..07b26e83e934d 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -57,6 +57,9 @@ import java.util.concurrent.TimeoutException; * spooler if needed, to make the timed remote calls, to handle * remote exceptions, and to bind/unbind to the remote instance as * needed. + * + * The calls might be blocking and need the main thread of to be unblocked to finish. Hence do not + * call this while holding any monitors that might need to be acquired the main thread. */ final class RemotePrintSpooler { diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 05301c1cb5f2c..a91cdb38a15ad 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -434,12 +434,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) { + mSpooler.clearCustomPrinterIconCache(); + synchronized (mLock) { throwIfDestroyedLocked(); if (mPrinterDiscoverySession == null) { - mSpooler.clearCustomPrinterIconCache(); - // If we do not have a session, tell all service to create one. mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) { @Override @@ -731,6 +731,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, @Override public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) { + mSpooler.onCustomPrinterIconLoaded(printerId, icon); + synchronized (mLock) { throwIfDestroyedLocked(); @@ -738,7 +740,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, if (mPrinterDiscoverySession == null) { return; } - mSpooler.onCustomPrinterIconLoaded(printerId, icon); mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId); } } @@ -979,18 +980,21 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, * Prune persistent state if a print service was uninstalled */ public void prunePrintServices() { + ArrayList installedComponents; + synchronized (mLock) { - ArrayList installedComponents = getInstalledComponents(); + installedComponents = getInstalledComponents(); // Remove unnecessary entries from persistent state "disabled services" boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents); if (disabledServicesUninstalled) { writeDisabledPrintServicesLocked(mDisabledServices); } - - // Remove unnecessary entries from persistent state "approved services" - mSpooler.pruneApprovedPrintServices(installedComponents); } + + // Remove unnecessary entries from persistent state "approved services" + mSpooler.pruneApprovedPrintServices(installedComponents); + } private void onConfigurationChangedLocked() {