diff options
5 files changed, 156 insertions, 295 deletions
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index fc88e9006639..0417ded829e8 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -683,6 +683,23 @@ public class Handler { return enqueueMessage(queue, msg, 0); } + /** + * Executes the message synchronously if called on the same thread this handler corresponds to, + * or {@link #sendMessage pushes it to the queue} otherwise + * + * @return Returns true if the message was successfully ran or placed in to the + * message queue. Returns false on failure, usually because the + * looper processing the message queue is exiting. + * @hide + */ + public final boolean executeOrSendMessage(Message msg) { + if (mLooper == Looper.myLooper()) { + dispatchMessage(msg); + return true; + } + return sendMessage(msg); + } + private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java index 53e8813c7363..eba5edbf6d68 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java @@ -31,6 +31,7 @@ import android.graphics.drawable.Icon; import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.ParcelFileDescriptor; @@ -58,11 +59,11 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.logging.MetricsLogger; -import com.android.internal.os.HandlerCaller; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.util.dump.DualDumpOutputStream; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.printspooler.R; import com.android.printspooler.util.ApprovedPrintServices; @@ -116,8 +117,6 @@ public final class PrintSpoolerService extends Service { private IPrintSpoolerClient mClient; - private HandlerCaller mHandlerCaller; - private PersistenceManager mPersistanceManager; private NotificationController mNotificationController; @@ -134,8 +133,6 @@ public final class PrintSpoolerService extends Service { @Override public void onCreate() { super.onCreate(); - mHandlerCaller = new HandlerCaller(this, getMainLooper(), - new HandlerCallerCallback(), false); mPersistanceManager = new PersistenceManager(); mNotificationController = new NotificationController(PrintSpoolerService.this); @@ -230,93 +227,73 @@ public final class PrintSpoolerService extends Service { } private void sendOnPrintJobQueued(PrintJobInfo printJob) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_QUEUED, printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobQueued, this, printJob); + Handler.getMain().executeOrSendMessage(message); } private void sendOnAllPrintJobsForServiceHandled(ComponentName service) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED, service); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onAllPrintJobsForServiceHandled, this, service); + Handler.getMain().executeOrSendMessage(message); } private void sendOnAllPrintJobsHandled() { - Message message = mHandlerCaller.obtainMessage( - HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_HANDLED); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onAllPrintJobsHandled, this); + Handler.getMain().executeOrSendMessage(message); } - private final class HandlerCallerCallback implements HandlerCaller.Callback { - public static final int MSG_SET_CLIENT = 1; - public static final int MSG_ON_PRINT_JOB_QUEUED = 2; - public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 3; - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 4; - public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 5; - public static final int MSG_ON_PRINT_JOB_STATE_CHANGED = 6; - - @Override - public void executeMessage(Message message) { - switch (message.what) { - case MSG_SET_CLIENT: { - synchronized (mLock) { - mClient = (IPrintSpoolerClient) message.obj; - if (mClient != null) { - Message msg = mHandlerCaller.obtainMessage( - HandlerCallerCallback.MSG_CHECK_ALL_PRINTJOBS_HANDLED); - mHandlerCaller.sendMessageDelayed(msg, - CHECK_ALL_PRINTJOBS_HANDLED_DELAY); - } - } - } break; - case MSG_ON_PRINT_JOB_QUEUED: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - if (mClient != null) { - try { - mClient.onPrintJobQueued(printJob); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for a queued print job.", re); - } - } - } break; + private void onPrintJobStateChanged(PrintJobInfo printJob) { + if (mClient != null) { + try { + mClient.onPrintJobStateChanged(printJob); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for print job state change.", re); + } + } + } - case MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED: { - ComponentName service = (ComponentName) message.obj; - if (mClient != null) { - try { - mClient.onAllPrintJobsForServiceHandled(service); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for all print jobs per service" - + " handled.", re); - } - } - } break; + private void onAllPrintJobsHandled() { + if (mClient != null) { + try { + mClient.onAllPrintJobsHandled(); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for all print job handled.", re); + } + } + } - case MSG_ON_ALL_PRINT_JOBS_HANDLED: { - if (mClient != null) { - try { - mClient.onAllPrintJobsHandled(); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for all print job handled.", re); - } - } - } break; + private void onAllPrintJobsForServiceHandled(ComponentName service) { + if (mClient != null) { + try { + mClient.onAllPrintJobsForServiceHandled(service); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for all print jobs per service" + + " handled.", re); + } + } + } - case MSG_CHECK_ALL_PRINTJOBS_HANDLED: { - checkAllPrintJobsHandled(); - } break; + private void onPrintJobQueued(PrintJobInfo printJob) { + if (mClient != null) { + try { + mClient.onPrintJobQueued(printJob); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for a queued print job.", re); + } + } + } - case MSG_ON_PRINT_JOB_STATE_CHANGED: { - if (mClient != null) { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - try { - mClient.onPrintJobStateChanged(printJob); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for print job state change.", re); - } - } - } break; + private void setClient(IPrintSpoolerClient client) { + synchronized (mLock) { + mClient = client; + if (mClient != null) { + Message msg = PooledLambda.obtainMessage( + PrintSpoolerService::checkAllPrintJobsHandled, this); + Handler.getMain().sendMessageDelayed(msg, + CHECK_ALL_PRINTJOBS_HANDLED_DELAY); } } } @@ -379,10 +356,9 @@ public final class PrintSpoolerService extends Service { addPrintJobLocked(printJob); setPrintJobState(printJob.getId(), PrintJobInfo.STATE_CREATED, null); - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); } } @@ -546,10 +522,9 @@ public final class PrintSpoolerService extends Service { * @param printJob The updated print job. */ private void notifyPrintJobUpdated(PrintJobInfo printJob) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); mNotificationController.onUpdateNotifications(mPrintJobs); } @@ -742,10 +717,9 @@ public final class PrintSpoolerService extends Service { } mNotificationController.onUpdateNotifications(mPrintJobs); - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); } } } @@ -1472,9 +1446,9 @@ public final class PrintSpoolerService extends Service { @Override public void setClient(IPrintSpoolerClient client) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_SET_CLIENT, client); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::setClient, PrintSpoolerService.this, client); + Handler.getMain().executeOrSendMessage(message); } @Override diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java index b6a003de0eb9..164454690d46 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java @@ -16,7 +16,6 @@ package com.android.printspooler.model; -import android.annotation.NonNull; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; @@ -39,6 +38,7 @@ import android.print.PrintDocumentAdapter; import android.print.PrintDocumentInfo; import android.util.Log; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.printspooler.R; import com.android.printspooler.util.PageRangeUtils; @@ -549,6 +549,9 @@ public final class RemotePrintDocument { } private static abstract class AsyncCommand implements Runnable { + /** Message indicated the desire to {@link #forceCancel} a command */ + static final int MSG_FORCE_CANCEL = 0; + private static final int STATE_PENDING = 0; private static final int STATE_RUNNING = 1; private static final int STATE_COMPLETED = 2; @@ -574,7 +577,7 @@ public final class RemotePrintDocument { public AsyncCommand(Looper looper, IPrintDocumentAdapter adapter, RemotePrintDocumentInfo document, CommandDoneCallback doneCallback) { - mHandler = new AsyncCommandHandler(looper); + mHandler = new Handler(looper); mAdapter = adapter; mDocument = document; mDoneCallback = doneCallback; @@ -594,12 +597,12 @@ public final class RemotePrintDocument { */ protected void removeForceCancel() { if (DEBUG) { - if (mHandler.hasMessages(AsyncCommandHandler.MSG_FORCE_CANCEL)) { + if (mHandler.hasMessages(MSG_FORCE_CANCEL)) { Log.i(LOG_TAG, "[FORCE CANCEL] Removed"); } } - mHandler.removeMessages(AsyncCommandHandler.MSG_FORCE_CANCEL); + mHandler.removeMessages(MSG_FORCE_CANCEL); } /** @@ -628,7 +631,8 @@ public final class RemotePrintDocument { Log.i(LOG_TAG, "[FORCE CANCEL] queued"); } mHandler.sendMessageDelayed( - mHandler.obtainMessage(AsyncCommandHandler.MSG_FORCE_CANCEL), + PooledLambda.obtainMessage(AsyncCommand::forceCancel, this) + .setWhat(MSG_FORCE_CANCEL), FORCE_CANCEL_TIMEOUT); } @@ -698,34 +702,15 @@ public final class RemotePrintDocument { return mError; } - /** - * Handler for the async command. - */ - private class AsyncCommandHandler extends Handler { - /** Message indicated the desire for to force cancel a command */ - final static int MSG_FORCE_CANCEL = 0; - - AsyncCommandHandler(@NonNull Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_FORCE_CANCEL: - if (isCanceling()) { - if (DEBUG) { - Log.i(LOG_TAG, "[FORCE CANCEL] executed"); - } - failed("Command did not respond to cancellation in " - + FORCE_CANCEL_TIMEOUT + " ms"); - - mDoneCallback.onDone(); - } - break; - default: - // not reached; + private void forceCancel() { + if (isCanceling()) { + if (DEBUG) { + Log.i(LOG_TAG, "[FORCE CANCEL] executed"); } + failed("Command did not respond to cancellation in " + + FORCE_CANCEL_TIMEOUT + " ms"); + + mDoneCallback.onDone(); } } } diff --git a/services/print/java/com/android/server/print/RemotePrintService.java b/services/print/java/com/android/server/print/RemotePrintService.java index f72d8eee7b9b..d4cbe7b1cf66 100644 --- a/services/print/java/com/android/server/print/RemotePrintService.java +++ b/services/print/java/com/android/server/print/RemotePrintService.java @@ -18,6 +18,7 @@ package com.android.server.print; import static com.android.internal.print.DumpUtils.writePrinterId; import static com.android.internal.util.dump.DumpUtils.writeComponentName; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.annotation.FloatRange; import android.annotation.NonNull; @@ -33,8 +34,6 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; -import android.os.Looper; -import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.UserHandle; @@ -86,8 +85,6 @@ final class RemotePrintService implements DeathRecipient { private final RemotePrintServiceClient mPrintServiceClient; - private final Handler mHandler; - private IPrintService mPrintService; private boolean mBinding; @@ -128,7 +125,6 @@ final class RemotePrintService implements DeathRecipient { mIntent = new Intent().setComponent(mComponentName); mUserId = userId; mSpooler = spooler; - mHandler = new MyHandler(context.getMainLooper()); mPrintServiceClient = new RemotePrintServiceClient(this); } @@ -137,7 +133,8 @@ final class RemotePrintService implements DeathRecipient { } public void destroy() { - mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleDestroy, this)); } private void handleDestroy() { @@ -163,7 +160,8 @@ final class RemotePrintService implements DeathRecipient { @Override public void binderDied() { - mHandler.sendEmptyMessage(MyHandler.MSG_BINDER_DIED); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleBinderDied, this)); } private void handleBinderDied() { @@ -177,7 +175,8 @@ final class RemotePrintService implements DeathRecipient { } public void onAllPrintJobsHandled() { - mHandler.sendEmptyMessage(MyHandler.MSG_ON_ALL_PRINT_JOBS_HANDLED); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleOnAllPrintJobsHandled, this)); } private void handleOnAllPrintJobsHandled() { @@ -209,8 +208,8 @@ final class RemotePrintService implements DeathRecipient { } public void onRequestCancelPrintJob(PrintJobInfo printJob) { - mHandler.obtainMessage(MyHandler.MSG_ON_REQUEST_CANCEL_PRINT_JOB, - printJob).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleRequestCancelPrintJob, this, printJob)); } private void handleRequestCancelPrintJob(final PrintJobInfo printJob) { @@ -235,8 +234,8 @@ final class RemotePrintService implements DeathRecipient { } public void onPrintJobQueued(PrintJobInfo printJob) { - mHandler.obtainMessage(MyHandler.MSG_ON_PRINT_JOB_QUEUED, - printJob).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleOnPrintJobQueued, this, printJob)); } private void handleOnPrintJobQueued(final PrintJobInfo printJob) { @@ -262,7 +261,8 @@ final class RemotePrintService implements DeathRecipient { } public void createPrinterDiscoverySession() { - mHandler.sendEmptyMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleCreatePrinterDiscoverySession, this)); } private void handleCreatePrinterDiscoverySession() { @@ -288,7 +288,8 @@ final class RemotePrintService implements DeathRecipient { } public void destroyPrinterDiscoverySession() { - mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY_PRINTER_DISCOVERY_SESSION); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleDestroyPrinterDiscoverySession, this)); } private void handleDestroyPrinterDiscoverySession() { @@ -325,8 +326,8 @@ final class RemotePrintService implements DeathRecipient { } public void startPrinterDiscovery(List<PrinterId> priorityList) { - mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_DISCOVERY, - priorityList).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStartPrinterDiscovery, this, priorityList)); } private void handleStartPrinterDiscovery(final List<PrinterId> priorityList) { @@ -356,7 +357,8 @@ final class RemotePrintService implements DeathRecipient { } public void stopPrinterDiscovery() { - mHandler.sendEmptyMessage(MyHandler.MSG_STOP_PRINTER_DISCOVERY); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStopPrinterDiscovery, this)); } private void handleStopPrinterDiscovery() { @@ -387,8 +389,8 @@ final class RemotePrintService implements DeathRecipient { } public void validatePrinters(List<PrinterId> printerIds) { - mHandler.obtainMessage(MyHandler.MSG_VALIDATE_PRINTERS, - printerIds).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleValidatePrinters, this, printerIds)); } private void handleValidatePrinters(final List<PrinterId> printerIds) { @@ -413,8 +415,8 @@ final class RemotePrintService implements DeathRecipient { } public void startPrinterStateTracking(@NonNull PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_STATE_TRACKING, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStartPrinterStateTracking, this, printerId)); } /** @@ -424,8 +426,8 @@ final class RemotePrintService implements DeathRecipient { * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon */ public void requestCustomPrinterIcon(@NonNull PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_REQUEST_CUSTOM_PRINTER_ICON, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleRequestCustomPrinterIcon, this, printerId)); } /** @@ -481,8 +483,8 @@ final class RemotePrintService implements DeathRecipient { } public void stopPrinterStateTracking(PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_STOP_PRINTER_STATE_TRACKING, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStopPrinterStateTracking, this, printerId)); } private void handleStopPrinterStateTracking(final PrinterId printerId) { @@ -672,96 +674,6 @@ final class RemotePrintService implements DeathRecipient { } } - private final class MyHandler extends Handler { - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1; - public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2; - public static final int MSG_START_PRINTER_DISCOVERY = 3; - public static final int MSG_STOP_PRINTER_DISCOVERY = 4; - public static final int MSG_VALIDATE_PRINTERS = 5; - public static final int MSG_START_PRINTER_STATE_TRACKING = 6; - public static final int MSG_STOP_PRINTER_STATE_TRACKING = 7; - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 8; - public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 9; - public static final int MSG_ON_PRINT_JOB_QUEUED = 10; - public static final int MSG_DESTROY = 11; - public static final int MSG_BINDER_DIED = 12; - public static final int MSG_REQUEST_CUSTOM_PRINTER_ICON = 13; - - public MyHandler(Looper looper) { - super(looper, null, false); - } - - @Override - @SuppressWarnings("unchecked") - public void handleMessage(Message message) { - if (mDestroyed) { - Slog.w(LOG_TAG, "Not handling " + message + " as service for " + mComponentName - + " is already destroyed"); - return; - } - switch (message.what) { - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { - handleCreatePrinterDiscoverySession(); - } break; - - case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: { - handleDestroyPrinterDiscoverySession(); - } break; - - case MSG_START_PRINTER_DISCOVERY: { - List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj; - handleStartPrinterDiscovery(priorityList); - } break; - - case MSG_STOP_PRINTER_DISCOVERY: { - handleStopPrinterDiscovery(); - } break; - - case MSG_VALIDATE_PRINTERS: { - List<PrinterId> printerIds = (List<PrinterId>) message.obj; - handleValidatePrinters(printerIds); - } break; - - case MSG_START_PRINTER_STATE_TRACKING: { - PrinterId printerId = (PrinterId) message.obj; - handleStartPrinterStateTracking(printerId); - } break; - - case MSG_STOP_PRINTER_STATE_TRACKING: { - PrinterId printerId = (PrinterId) message.obj; - handleStopPrinterStateTracking(printerId); - } break; - - case MSG_ON_ALL_PRINT_JOBS_HANDLED: { - handleOnAllPrintJobsHandled(); - } break; - - case MSG_ON_REQUEST_CANCEL_PRINT_JOB: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - handleRequestCancelPrintJob(printJob); - } break; - - case MSG_ON_PRINT_JOB_QUEUED: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - handleOnPrintJobQueued(printJob); - } break; - - case MSG_DESTROY: { - handleDestroy(); - } break; - - case MSG_BINDER_DIED: { - handleBinderDied(); - } break; - - case MSG_REQUEST_CUSTOM_PRINTER_ICON: { - PrinterId printerId = (PrinterId) message.obj; - handleRequestCustomPrinterIcon(printerId); - } break; - } - } - } - private static final class RemotePrintServiceClient extends IPrintServiceClient.Stub { private final WeakReference<RemotePrintService> mWeakService; diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 3c09cb193af3..62185d782cbc 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -45,7 +45,6 @@ import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.IInterface; import android.os.Looper; -import android.os.Message; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.UserHandle; @@ -81,6 +80,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.BackgroundThread; import com.android.internal.util.dump.DualDumpOutputStream; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.print.RemotePrintService.PrintServiceCallbacks; import com.android.server.print.RemotePrintServiceRecommendationService .RemotePrintServiceRecommendationServiceCallbacks; @@ -93,6 +93,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.IntSupplier; /** * Represents the print state for a user. @@ -134,8 +135,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, private final RemotePrintSpooler mSpooler; - private final Handler mHandler; - private PrinterDiscoverySessionMediator mPrinterDiscoverySession; private List<PrintJobStateChangeListenerRecord> mPrintJobStateChangeListenerRecords; @@ -161,7 +160,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, mUserId = userId; mLock = lock; mSpooler = new RemotePrintSpooler(context, userId, lowPriority, this); - mHandler = new UserStateHandler(context.getMainLooper()); synchronized (mLock) { readInstalledPrintServicesLocked(); @@ -172,9 +170,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, // Some print services might have gotten installed before the User State came up prunePrintServices(); - synchronized (mLock) { - onConfigurationChangedLocked(); - } + onConfigurationChanged(); } public void increasePriority() { @@ -695,18 +691,22 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, @Override public void onPrintJobStateChanged(PrintJobInfo printJob) { mPrintJobForAppCache.onPrintJobStateChanged(printJob); - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_JOB_STATE_CHANGED, - printJob.getAppId(), 0, printJob.getId()).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintJobStateChanged, + this, printJob.getId(), + PooledLambda.obtainSupplier(printJob.getAppId()).recycleOnUse())); } public void onPrintServicesChanged() { - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_CHANGED).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintServicesChanged, this)); } @Override public void onPrintServiceRecommendationsUpdated(List<RecommendationInfo> recommendations) { - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED, - 0, 0, recommendations).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintServiceRecommendationsUpdated, + this, recommendations)); } @Override @@ -771,8 +771,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, mActiveServices.remove(service.getComponentName()); // The service might need to be restarted if it died because of an update - mHandler.sendMessageDelayed( - mHandler.obtainMessage(UserStateHandler.MSG_CHECK_CONFIG_CHANGED), + Handler.getMain().sendMessageDelayed(obtainMessage( + UserState::onConfigurationChanged, this), SERVICE_RESTART_DELAY_MILLIS); // No session - nothing to do. @@ -1112,24 +1112,26 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - private void handleDispatchPrintJobStateChanged(PrintJobId printJobId, int appId) { + private void handleDispatchPrintJobStateChanged( + PrintJobId printJobId, IntSupplier appIdSupplier) { + int appId = appIdSupplier.getAsInt(); final List<PrintJobStateChangeListenerRecord> records; synchronized (mLock) { if (mPrintJobStateChangeListenerRecords == null) { return; } - records = new ArrayList<PrintJobStateChangeListenerRecord>( - mPrintJobStateChangeListenerRecords); + records = new ArrayList<>(mPrintJobStateChangeListenerRecords); } final int recordCount = records.size(); for (int i = 0; i < recordCount; i++) { PrintJobStateChangeListenerRecord record = records.get(i); if (record.appId == PrintManager.APP_ID_ANY - || record.appId == appId) - try { - record.listener.onPrintJobStateChanged(printJobId); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error notifying for print job state change", re); + || record.appId == appId) { + try { + record.listener.onPrintJobStateChanged(printJobId); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error notifying for print job state change", re); + } } } } @@ -1177,38 +1179,9 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - private final class UserStateHandler extends Handler { - public static final int MSG_DISPATCH_PRINT_JOB_STATE_CHANGED = 1; - public static final int MSG_DISPATCH_PRINT_SERVICES_CHANGED = 2; - public static final int MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED = 3; - public static final int MSG_CHECK_CONFIG_CHANGED = 4; - - public UserStateHandler(Looper looper) { - super(looper, null, false); - } - - @Override - public void handleMessage(Message message) { - switch (message.what) { - case MSG_DISPATCH_PRINT_JOB_STATE_CHANGED: - PrintJobId printJobId = (PrintJobId) message.obj; - final int appId = message.arg1; - handleDispatchPrintJobStateChanged(printJobId, appId); - break; - case MSG_DISPATCH_PRINT_SERVICES_CHANGED: - handleDispatchPrintServicesChanged(); - break; - case MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED: - handleDispatchPrintServiceRecommendationsUpdated( - (List<RecommendationInfo>) message.obj); - break; - case MSG_CHECK_CONFIG_CHANGED: - synchronized (mLock) { - onConfigurationChangedLocked(); - } - default: - // not reached - } + private void onConfigurationChanged() { + synchronized (mLock) { + onConfigurationChangedLocked(); } } |