Hold no locks when calling RemotePrintSpooler

am: 1d6e7cc536

Change-Id: I9765689a63eb7a3426feee43b970aa0a9f2fb441
This commit is contained in:
Philip P. Moltmann
2016-08-29 23:26:32 +00:00
committed by android-build-merger
2 changed files with 14 additions and 7 deletions

View File

@@ -57,6 +57,9 @@ import java.util.concurrent.TimeoutException;
* spooler if needed, to make the timed remote calls, to handle * spooler if needed, to make the timed remote calls, to handle
* remote exceptions, and to bind/unbind to the remote instance as * remote exceptions, and to bind/unbind to the remote instance as
* needed. * 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 { final class RemotePrintSpooler {

View File

@@ -434,12 +434,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
} }
public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) { public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) {
mSpooler.clearCustomPrinterIconCache();
synchronized (mLock) { synchronized (mLock) {
throwIfDestroyedLocked(); throwIfDestroyedLocked();
if (mPrinterDiscoverySession == null) { if (mPrinterDiscoverySession == null) {
mSpooler.clearCustomPrinterIconCache();
// If we do not have a session, tell all service to create one. // If we do not have a session, tell all service to create one.
mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) { mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) {
@Override @Override
@@ -731,6 +731,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
@Override @Override
public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) { public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) {
mSpooler.onCustomPrinterIconLoaded(printerId, icon);
synchronized (mLock) { synchronized (mLock) {
throwIfDestroyedLocked(); throwIfDestroyedLocked();
@@ -738,7 +740,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
if (mPrinterDiscoverySession == null) { if (mPrinterDiscoverySession == null) {
return; return;
} }
mSpooler.onCustomPrinterIconLoaded(printerId, icon);
mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId); mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId);
} }
} }
@@ -979,18 +980,21 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
* Prune persistent state if a print service was uninstalled * Prune persistent state if a print service was uninstalled
*/ */
public void prunePrintServices() { public void prunePrintServices() {
ArrayList<ComponentName> installedComponents;
synchronized (mLock) { synchronized (mLock) {
ArrayList<ComponentName> installedComponents = getInstalledComponents(); installedComponents = getInstalledComponents();
// Remove unnecessary entries from persistent state "disabled services" // Remove unnecessary entries from persistent state "disabled services"
boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents); boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents);
if (disabledServicesUninstalled) { if (disabledServicesUninstalled) {
writeDisabledPrintServicesLocked(mDisabledServices); 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() { private void onConfigurationChangedLocked() {