Merge "Hold wake lock while printing"

This commit is contained in:
TreeHugger Robot
2018-05-19 01:16:49 +00:00
committed by Android (Google) Code Review
2 changed files with 72 additions and 4 deletions

View File

@@ -586,6 +586,15 @@ public final class PrintJobInfo implements Parcelable {
mCanceling = cancelling;
}
/**
* If the print job is actively processed, i.e. the device needs to stay on.
*
* @hide
*/
public boolean shouldStayAwake() {
return mCanceling || mState == STATE_STARTED || mState == STATE_QUEUED;
}
/**
* Gets whether this job has a given advanced (printer specific) print
* option.

View File

@@ -16,6 +16,8 @@
package com.android.printspooler.model;
import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
import static com.android.internal.print.DumpUtils.writePrintJobInfo;
import static com.android.internal.util.dump.DumpUtils.writeComponentName;
@@ -35,6 +37,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.RemoteException;
import android.print.IPrintSpooler;
import android.print.IPrintSpoolerCallbacks;
@@ -124,6 +127,9 @@ public final class PrintSpoolerService extends Service {
/** Cache for custom printer icons loaded from the print service */
private CustomPrinterIconCache mCustomIconCache;
/** If the system should be kept awake to process print jobs */
private PowerManager.WakeLock mKeepAwake;
public static PrintSpoolerService peekInstance() {
synchronized (sLock) {
return sInstance;
@@ -137,6 +143,8 @@ public final class PrintSpoolerService extends Service {
mPersistanceManager = new PersistenceManager();
mNotificationController = new NotificationController(PrintSpoolerService.this);
mCustomIconCache = new CustomPrinterIconCache(getCacheDir());
mKeepAwake = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK,
"Active Print Job");
synchronized (mLock) {
mPersistanceManager.readStateLocked();
@@ -480,6 +488,11 @@ public final class PrintSpoolerService extends Service {
private void addPrintJobLocked(PrintJobInfo printJob) {
mPrintJobs.add(printJob);
if (printJob.shouldStayAwake()) {
keepAwakeLocked();
}
if (DEBUG_PRINT_JOB_LIFECYCLE) {
Slog.i(LOG_TAG, "[ADD] " + printJob);
}
@@ -500,6 +513,9 @@ public final class PrintSpoolerService extends Service {
persistState = true;
}
}
checkIfStillKeepAwakeLocked();
if (persistState) {
mPersistanceManager.writeStateLocked();
}
@@ -546,6 +562,12 @@ public final class PrintSpoolerService extends Service {
printJob.setStatus(error);
printJob.setCancelling(false);
if (printJob.shouldStayAwake()) {
keepAwakeLocked();
} else {
checkIfStillKeepAwakeLocked();
}
if (DEBUG_PRINT_JOB_LIFECYCLE) {
Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob);
}
@@ -717,6 +739,12 @@ public final class PrintSpoolerService extends Service {
}
mNotificationController.onUpdateNotifications(mPrintJobs);
if (printJob.shouldStayAwake()) {
keepAwakeLocked();
} else {
checkIfStillKeepAwakeLocked();
}
Message message = PooledLambda.obtainMessage(
PrintSpoolerService::onPrintJobStateChanged, this, printJob);
Handler.getMain().executeOrSendMessage(message);
@@ -1098,7 +1126,7 @@ public final class PrintSpoolerService extends Service {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, StandardCharsets.UTF_8.name());
parseState(parser);
parseStateLocked(parser);
} catch (IllegalStateException ise) {
Slog.w(LOG_TAG, "Failed parsing ", ise);
} catch (NullPointerException npe) {
@@ -1116,14 +1144,14 @@ public final class PrintSpoolerService extends Service {
}
}
private void parseState(XmlPullParser parser)
private void parseStateLocked(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.next();
skipEmptyTextTags(parser);
expect(parser, XmlPullParser.START_TAG, TAG_SPOOLER);
parser.next();
while (parsePrintJob(parser)) {
while (parsePrintJobLocked(parser)) {
parser.next();
}
@@ -1131,7 +1159,7 @@ public final class PrintSpoolerService extends Service {
expect(parser, XmlPullParser.END_TAG, TAG_SPOOLER);
}
private boolean parsePrintJob(XmlPullParser parser)
private boolean parsePrintJobLocked(XmlPullParser parser)
throws IOException, XmlPullParserException {
skipEmptyTextTags(parser);
if (!accept(parser, XmlPullParser.START_TAG, TAG_JOB)) {
@@ -1343,6 +1371,10 @@ public final class PrintSpoolerService extends Service {
mPrintJobs.add(printJob);
if (printJob.shouldStayAwake()) {
keepAwakeLocked();
}
if (DEBUG_PERSISTENCE) {
Log.i(LOG_TAG, "[RESTORED] " + printJob);
}
@@ -1386,6 +1418,33 @@ public final class PrintSpoolerService extends Service {
}
}
/**
* Keep the system awake as a print job needs to be processed.
*/
private void keepAwakeLocked() {
if (!mKeepAwake.isHeld()) {
mKeepAwake.acquire();
}
}
/**
* Check if we still need to keep the system awake.
*
* @see #keepAwakeLocked
*/
private void checkIfStillKeepAwakeLocked() {
if (mKeepAwake.isHeld()) {
int numPrintJobs = mPrintJobs.size();
for (int i = 0; i < numPrintJobs; i++) {
if (mPrintJobs.get(i).shouldStayAwake()) {
return;
}
}
mKeepAwake.release();
}
}
public final class PrintSpooler extends IPrintSpooler.Stub {
@Override
public void getPrintJobInfos(IPrintSpoolerCallbacks callback,