summaryrefslogtreecommitdiffstats
path: root/packages/PrintSpooler/src
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2013-10-25 18:57:43 -0700
committerSvetoslav <svetoslavganov@google.com>2013-10-28 11:44:07 -0700
commitb4fda134761c9521a7e127db3806a07a18763b77 (patch)
tree1a4bbcb89d28595447086ab2d98db8f257a0e952 /packages/PrintSpooler/src
parent2ead75109cf21223b7754fc3906c86d2fbd145cb (diff)
downloadframeworks_base-b4fda134761c9521a7e127db3806a07a18763b77.zip
frameworks_base-b4fda134761c9521a7e127db3806a07a18763b77.tar.gz
frameworks_base-b4fda134761c9521a7e127db3806a07a18763b77.tar.bz2
Complete implementation of the advanced print options.
1. Implemented the advanced printer options integration. Now a print service may declare an advanced print options activity which may be launched by the user if the current printer supports advanced print options. These options are visible only to the print service that added them and it is the only party that will interpret the options. 2. Fixed a couple of bugs in the saved print jobs parsing. One was that if there are more than one page range, a half of the print job properties was not properly parsed. The other was that the media size constructor was using incorrect argument order, thus creating a media size with wring width. 3. Fixed and edge case where old print jobs and their docs can get stuck in the spooler. If the app did not write the requested pages we were not showing an error message, rather just finish the activity without canceling the print job and this print job is stuck in the spooler. Now we show an error message and the user may retry, cancel. If the user cancels the print job is also cancelled, thus no leftover in the spooler. 4. Fixed the background color of the print dialog to meet UX spec. bug:11241800 Change-Id: I352440bc86aec824a805883fc9579d96a06d11e6
Diffstat (limited to 'packages/PrintSpooler/src')
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java249
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java74
2 files changed, 293 insertions, 30 deletions
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index db3770e..8f26361 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -19,6 +19,7 @@ package com.android.printspooler;
import android.app.Activity;
import android.app.Dialog;
import android.app.LoaderManager;
+import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -26,6 +27,8 @@ import android.content.Loader;
import android.content.ServiceConnection;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.database.DataSetObserver;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -55,6 +58,8 @@ import android.print.PrintManager;
import android.print.PrinterCapabilitiesInfo;
import android.print.PrinterId;
import android.print.PrinterInfo;
+import android.printservice.PrintService;
+import android.printservice.PrintServiceInfo;
import android.provider.DocumentsContract;
import android.text.Editable;
import android.text.TextUtils;
@@ -130,6 +135,7 @@ public class PrintJobConfigActivity extends Activity {
private static final int ACTIVITY_REQUEST_CREATE_FILE = 1;
private static final int ACTIVITY_REQUEST_SELECT_PRINTER = 2;
+ private static final int ACTIVITY_POPULATE_ADVANCED_PRINT_OPTIONS = 3;
private static final int CONTROLLER_STATE_FINISHED = 1;
private static final int CONTROLLER_STATE_FAILED = 2;
@@ -254,28 +260,27 @@ public class PrintJobConfigActivity extends Activity {
}
@Override
- protected void onDestroy() {
- // We can safely do the work in here since at this point
- // the system is bound to our (spooler) process which
- // guarantees that this process will not be killed.
- if (mController != null && mController.hasStarted()) {
- mController.finish();
- }
- if (mEditor != null && mEditor.isPrintConfirmed()
- && mController != null && mController.isFinished()) {
- mSpoolerProvider.getSpooler().setPrintJobState(mPrintJobId,
- PrintJobInfo.STATE_QUEUED, null);
- } else {
- mSpoolerProvider.getSpooler().setPrintJobState(mPrintJobId,
- PrintJobInfo.STATE_CANCELED, null);
- }
- if (mGeneratingPrintJobDialog != null) {
- mGeneratingPrintJobDialog.dismiss();
- mGeneratingPrintJobDialog = null;
- }
- mIPrintDocumentAdapter.unlinkToDeath(mDeathRecipient, 0);
- mSpoolerProvider.destroy();
- super.onDestroy();
+ public void onPause() {
+ if (isFinishing()) {
+ if (mController != null && mController.hasStarted()) {
+ mController.finish();
+ }
+ if (mEditor != null && mEditor.isPrintConfirmed()
+ && mController != null && mController.isFinished()) {
+ mSpoolerProvider.getSpooler().setPrintJobState(mPrintJobId,
+ PrintJobInfo.STATE_QUEUED, null);
+ } else {
+ mSpoolerProvider.getSpooler().setPrintJobState(mPrintJobId,
+ PrintJobInfo.STATE_CANCELED, null);
+ }
+ if (mGeneratingPrintJobDialog != null) {
+ mGeneratingPrintJobDialog.dismiss();
+ mGeneratingPrintJobDialog = null;
+ }
+ mIPrintDocumentAdapter.unlinkToDeath(mDeathRecipient, 0);
+ mSpoolerProvider.destroy();
+ }
+ super.onPause();
}
public boolean onTouchEvent(MotionEvent event) {
@@ -607,18 +612,14 @@ public class PrintJobConfigActivity extends Activity {
} else {
// We did not get the pages we requested, then the application
// misbehaves, so we fail quickly.
- // TODO: We need some UI for announcing an error.
mControllerState = CONTROLLER_STATE_FAILED;
Log.e(LOG_TAG, "Received invalid pages from the app");
- mEditor.cancel();
- PrintJobConfigActivity.this.finish();
+ mEditor.showUi(Editor.UI_ERROR, null);
}
}
private void requestCreatePdfFileOrFinish() {
if (mEditor.isPrintingToPdf()) {
- PrintJobInfo printJob = mSpoolerProvider.getSpooler()
- .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY);
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.setType("application/pdf");
intent.putExtra(Intent.EXTRA_TITLE, mDocument.info.getName());
@@ -791,6 +792,19 @@ public class PrintJobConfigActivity extends Activity {
}
mEditor.ensureCurrentPrinterSelected();
} break;
+
+ case ACTIVITY_POPULATE_ADVANCED_PRINT_OPTIONS: {
+ if (resultCode == RESULT_OK) {
+ PrintJobInfo printJobInfo = (PrintJobInfo) data.getParcelableExtra(
+ PrintService.EXTRA_PRINT_JOB_INFO);
+ if (printJobInfo != null) {
+ mEditor.updateFromAdvancedOptions(printJobInfo);
+ break;
+ }
+ }
+ mEditor.cancel();
+ PrintJobConfigActivity.this.finish();
+ } break;
}
}
@@ -869,6 +883,10 @@ public class PrintJobConfigActivity extends Activity {
private View mContentContainer;
+ private View mAdvancedPrintOptionsContainer;
+
+ private Button mAdvancedOptionsButton;
+
private Button mPrintButton;
private PrinterId mNextPrinterId;
@@ -932,6 +950,10 @@ public class PrintJobConfigActivity extends Activity {
refreshCurrentPrinter();
}
} else if (spinner == mMediaSizeSpinner) {
+ if (mIgnoreNextMediaSizeChange) {
+ mIgnoreNextMediaSizeChange = false;
+ return;
+ }
if (mOldMediaSizeSelectionIndex
== mMediaSizeSpinner.getSelectedItemPosition()) {
mOldMediaSizeSelectionIndex = AdapterView.INVALID_POSITION;
@@ -947,6 +969,10 @@ public class PrintJobConfigActivity extends Activity {
mController.update();
}
} else if (spinner == mColorModeSpinner) {
+ if (mIgnoreNextColorChange) {
+ mIgnoreNextColorChange = false;
+ return;
+ }
if (mOldColorModeSelectionIndex
== mColorModeSpinner.getSelectedItemPosition()) {
mOldColorModeSelectionIndex = AdapterView.INVALID_POSITION;
@@ -1193,6 +1219,16 @@ public class PrintJobConfigActivity extends Activity {
// greater than the to page. When computing the requested pages
// we just swap them if necessary.
+ // Keep the print job up to date with the selected pages if we
+ // know how many pages are there in the document.
+ PageRange[] requestedPages = getRequestedPages();
+ if (requestedPages != null && requestedPages.length > 0
+ && requestedPages[requestedPages.length - 1].getEnd()
+ < mDocument.info.getPageCount()) {
+ mSpoolerProvider.getSpooler().setPrintJobPagesNoPersistence(
+ mPrintJobId, requestedPages);
+ }
+
mPageRangeEditText.setError(null);
mPrintButton.setEnabled(true);
updateUi();
@@ -1215,6 +1251,8 @@ public class PrintJobConfigActivity extends Activity {
private boolean mIgnoreNextRangeOptionChange;
private boolean mIgnoreNextCopiesChange;
private boolean mIgnoreNextRangeChange;
+ private boolean mIgnoreNextMediaSizeChange;
+ private boolean mIgnoreNextColorChange;
private int mCurrentUi = UI_NONE;
@@ -1424,6 +1462,88 @@ public class PrintJobConfigActivity extends Activity {
}
}
+ public void updateFromAdvancedOptions(PrintJobInfo printJobInfo) {
+ boolean updateContent = false;
+
+ // Copies.
+ mCopiesEditText.setText(String.valueOf(printJobInfo.getCopies()));
+
+ // Media size and orientation
+ PrintAttributes attributes = printJobInfo.getAttributes();
+ if (!mCurrPrintAttributes.getMediaSize().equals(attributes.getMediaSize())) {
+ final int mediaSizeCount = mMediaSizeSpinnerAdapter.getCount();
+ for (int i = 0; i < mediaSizeCount; i++) {
+ MediaSize mediaSize = mMediaSizeSpinnerAdapter.getItem(i).value;
+ if (mediaSize.asPortrait().equals(attributes.getMediaSize().asPortrait())) {
+ updateContent = true;
+ mCurrPrintAttributes.setMediaSize(attributes.getMediaSize());
+ mMediaSizeSpinner.setSelection(i);
+ mIgnoreNextMediaSizeChange = true;
+ if (attributes.getMediaSize().isPortrait()) {
+ mOrientationSpinner.setSelection(0);
+ mIgnoreNextOrientationChange = true;
+ } else {
+ mOrientationSpinner.setSelection(1);
+ mIgnoreNextOrientationChange = true;
+ }
+ break;
+ }
+ }
+ }
+
+ // Color mode.
+ final int colorMode = attributes.getColorMode();
+ if (mCurrPrintAttributes.getColorMode() != colorMode) {
+ if (colorMode == PrintAttributes.COLOR_MODE_MONOCHROME) {
+ updateContent = true;
+ mColorModeSpinner.setSelection(0);
+ mIgnoreNextColorChange = true;
+ mCurrPrintAttributes.setColorMode(attributes.getColorMode());
+ } else if (colorMode == PrintAttributes.COLOR_MODE_COLOR) {
+ updateContent = true;
+ mColorModeSpinner.setSelection(1);
+ mIgnoreNextColorChange = true;
+ mCurrPrintAttributes.setColorMode(attributes.getColorMode());
+ }
+ }
+
+ // Range.
+ PageRange[] pageRanges = printJobInfo.getPages();
+ if (pageRanges != null && pageRanges.length > 0) {
+ pageRanges = PageRangeUtils.normalize(pageRanges);
+ final int pageRangeCount = pageRanges.length;
+ if (pageRangeCount == 1 && pageRanges[0] == PageRange.ALL_PAGES) {
+ mRangeOptionsSpinner.setSelection(0);
+ } else {
+ final int pageCount = mDocument.info.getPageCount();
+ if (pageRanges[0].getStart() >= 0
+ && pageRanges[pageRanges.length - 1].getEnd() < pageCount) {
+ mRangeOptionsSpinner.setSelection(1);
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < pageRangeCount; i++) {
+ if (builder.length() > 0) {
+ builder.append(',');
+ }
+ PageRange pageRange = pageRanges[i];
+ builder.append(pageRange.getStart());
+ builder.append('-');
+ builder.append(pageRange.getEnd());
+ }
+ mPageRangeEditText.setText(builder.toString());
+ }
+ }
+ }
+
+ // Update the advanced options.
+ mSpoolerProvider.getSpooler().setPrintJobAdvancedOptionsNoPersistence(
+ mPrintJobId, printJobInfo.getAdvancedOptions());
+
+ // Update the content if needed.
+ if (updateContent) {
+ mController.update();
+ }
+ }
+
public void ensurePrinterSelected(PrinterId printerId) {
// If the printer is not present maybe the loader is not
// updated yet. In this case make a note and as soon as
@@ -1609,6 +1729,44 @@ public class PrintJobConfigActivity extends Activity {
}
}
+ private void registerAdvancedPrintOptionsButtonClickListener() {
+ Button advancedOptionsButton = (Button) findViewById(R.id.advanced_settings_button);
+ advancedOptionsButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ ComponentName serviceName = mCurrentPrinter.getId().getServiceName();
+ String activityName = getAdvancedOptionsActivityName(serviceName);
+ if (TextUtils.isEmpty(activityName)) {
+ return;
+ }
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(new ComponentName(serviceName.getPackageName(),
+ activityName));
+
+ List<ResolveInfo> resolvedActivities = getPackageManager()
+ .queryIntentActivities(intent, 0);
+ if (resolvedActivities.isEmpty()) {
+ return;
+ }
+ // The activity is a component name, therefore it is one or none.
+ if (resolvedActivities.get(0).activityInfo.exported) {
+ PrintJobInfo printJobInfo = mSpoolerProvider.getSpooler().getPrintJobInfo(
+ mPrintJobId, PrintManager.APP_ID_ANY);
+ intent.putExtra(PrintService.EXTRA_PRINT_JOB_INFO, printJobInfo);
+ // TODO: Make this an API for the next release.
+ intent.putExtra("android.intent.extra.print.EXTRA_PRINTER_INFO",
+ mCurrentPrinter);
+ try {
+ startActivityForResult(intent,
+ ACTIVITY_POPULATE_ADVANCED_PRINT_OPTIONS);
+ } catch (ActivityNotFoundException anfe) {
+ Log.e(LOG_TAG, "Error starting activity for intent: " + intent, anfe);
+ }
+ }
+ }
+ });
+ }
+
private void registerPrintButtonClickListener() {
Button printButton = (Button) findViewById(R.id.print_button);
printButton.setOnClickListener(new OnClickListener() {
@@ -1656,6 +1814,9 @@ public class PrintJobConfigActivity extends Activity {
mEditor.initialize();
mEditor.bindUi();
mEditor.reselectCurrentPrinter();
+ if (!mController.hasPerformedLayout()) {
+ mController.update();
+ }
}
});
}
@@ -1857,6 +2018,11 @@ public class PrintJobConfigActivity extends Activity {
mPageRangeEditText.setOnFocusChangeListener(mFocusListener);
mPageRangeEditText.addTextChangedListener(mRangeTextWatcher);
+ // Advanced options button.
+ mAdvancedPrintOptionsContainer = findViewById(R.id.advanced_settings_container);
+ mAdvancedOptionsButton = (Button) findViewById(R.id.advanced_settings_button);
+ registerAdvancedPrintOptionsButtonClickListener();
+
// Print button
mPrintButton = (Button) findViewById(R.id.print_button);
registerPrintButtonClickListener();
@@ -1875,6 +2041,7 @@ public class PrintJobConfigActivity extends Activity {
mRangeOptionsSpinner.setEnabled(false);
mPageRangeEditText.setEnabled(false);
mPrintButton.setEnabled(false);
+ mAdvancedOptionsButton.setEnabled(false);
return false;
}
@@ -1900,6 +2067,7 @@ public class PrintJobConfigActivity extends Activity {
mRangeOptionsSpinner.setEnabled(false);
mPageRangeEditText.setEnabled(false);
mPrintButton.setEnabled(false);
+ mAdvancedOptionsButton.setEnabled(false);
return false;
} else {
boolean someAttributeSelectionChanged = false;
@@ -2077,7 +2245,17 @@ public class PrintJobConfigActivity extends Activity {
mPageRangeTitle.setVisibility(View.INVISIBLE);
}
- // Print/Print preview
+ // Advanced print options
+ ComponentName serviceName = mCurrentPrinter.getId().getServiceName();
+ if (!TextUtils.isEmpty(getAdvancedOptionsActivityName(serviceName))) {
+ mAdvancedPrintOptionsContainer.setVisibility(View.VISIBLE);
+ mAdvancedOptionsButton.setEnabled(true);
+ } else {
+ mAdvancedPrintOptionsContainer.setVisibility(View.GONE);
+ mAdvancedOptionsButton.setEnabled(false);
+ }
+
+ // Print
if (mDestinationSpinner.getSelectedItemId()
!= DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF) {
String newText = getString(R.string.print_button);
@@ -2117,6 +2295,21 @@ public class PrintJobConfigActivity extends Activity {
}
}
+ private String getAdvancedOptionsActivityName(ComponentName serviceName) {
+ PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
+ List<PrintServiceInfo> printServices = printManager.getEnabledPrintServices();
+ final int printServiceCount = printServices.size();
+ for (int i = 0; i < printServiceCount; i ++) {
+ PrintServiceInfo printServiceInfo = printServices.get(i);
+ ServiceInfo serviceInfo = printServiceInfo.getResolveInfo().serviceInfo;
+ if (serviceInfo.name.equals(serviceName.getClassName())
+ && serviceInfo.packageName.equals(serviceName.getPackageName())) {
+ return printServiceInfo.getAdvancedOptionsActivityName();
+ }
+ }
+ return null;
+ }
+
private void setMediaSizeSpinnerSelectionNoCallback(int position) {
if (mMediaSizeSpinner.getSelectedItemPosition() != position) {
mOldMediaSizeSelectionIndex = position;
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index 636e245..609ae64 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -20,6 +20,7 @@ import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.os.AsyncTask;
+import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -623,6 +624,16 @@ public final class PrintSpoolerService extends Service {
}
}
+ public void setPrintJobAdvancedOptionsNoPersistence(PrintJobId printJobId,
+ Bundle advancedOptions) {
+ synchronized (mLock) {
+ PrintJobInfo printJob = getPrintJobInfo(printJobId, PrintManager.APP_ID_ANY);
+ if (printJob != null) {
+ printJob.setAdvancedOptions(advancedOptions);
+ }
+ }
+ }
+
public void setPrintJobPrintDocumentInfoNoPersistence(PrintJobId printJobId,
PrintDocumentInfo info) {
synchronized (mLock) {
@@ -704,6 +715,14 @@ public final class PrintSpoolerService extends Service {
private static final String ATTR_STATE_REASON = "stateReason";
private static final String ATTR_CANCELLING = "cancelling";
+ private static final String TAG_ADVANCED_OPTIONS = "advancedOptions";
+ private static final String TAG_ADVANCED_OPTION = "advancedOption";
+ private static final String ATTR_KEY = "key";
+ private static final String ATTR_TYPE = "type";
+ private static final String ATTR_VALUE = "value";
+ private static final String TYPE_STRING = "string";
+ private static final String TYPE_INT = "int";
+
private static final String TAG_MEDIA_SIZE = "mediaSize";
private static final String TAG_RESOLUTION = "resolution";
private static final String TAG_MARGINS = "margins";
@@ -899,6 +918,30 @@ public final class PrintSpoolerService extends Service {
serializer.endTag(null, TAG_DOCUMENT_INFO);
}
+ Bundle advancedOptions = printJob.getAdvancedOptions();
+ if (advancedOptions != null) {
+ serializer.startTag(null, TAG_ADVANCED_OPTIONS);
+ for (String key : advancedOptions.keySet()) {
+ Object value = advancedOptions.get(key);
+ if (value instanceof String) {
+ String stringValue = (String) value;
+ serializer.startTag(null, TAG_ADVANCED_OPTION);
+ serializer.attribute(null, ATTR_KEY, key);
+ serializer.attribute(null, ATTR_TYPE, TYPE_STRING);
+ serializer.attribute(null, ATTR_VALUE, stringValue);
+ serializer.endTag(null, TAG_ADVANCED_OPTION);
+ } else if (value instanceof Integer) {
+ String intValue = Integer.toString((Integer) value);
+ serializer.startTag(null, TAG_ADVANCED_OPTION);
+ serializer.attribute(null, ATTR_KEY, key);
+ serializer.attribute(null, ATTR_TYPE, TYPE_INT);
+ serializer.attribute(null, ATTR_VALUE, intValue);
+ serializer.endTag(null, TAG_ADVANCED_OPTION);
+ }
+ }
+ serializer.endTag(null, TAG_ADVANCED_OPTIONS);
+ }
+
serializer.endTag(null, TAG_JOB);
if (DEBUG_PERSISTENCE) {
@@ -1027,6 +1070,7 @@ public final class PrintSpoolerService extends Service {
skipEmptyTextTags(parser);
expect(parser, XmlPullParser.END_TAG, TAG_PAGE_RANGE);
parser.next();
+ skipEmptyTextTags(parser);
}
if (pageRanges != null) {
PageRange[] pageRangesArray = new PageRange[pageRanges.size()];
@@ -1057,8 +1101,8 @@ public final class PrintSpoolerService extends Service {
final int labelResId = (labelResIdString != null)
? Integer.parseInt(labelResIdString) : 0;
label = parser.getAttributeValue(null, ATTR_LABEL);
- MediaSize mediaSize = new MediaSize(id, label, packageName, labelResId,
- widthMils, heightMils);
+ MediaSize mediaSize = new MediaSize(id, label, packageName,
+ widthMils, heightMils, labelResId);
builder.setMediaSize(mediaSize);
parser.next();
skipEmptyTextTags(parser);
@@ -1127,6 +1171,32 @@ public final class PrintSpoolerService extends Service {
parser.next();
}
+ skipEmptyTextTags(parser);
+ if (accept(parser, XmlPullParser.START_TAG, TAG_ADVANCED_OPTIONS)) {
+ parser.next();
+ skipEmptyTextTags(parser);
+ Bundle advancedOptions = new Bundle();
+ while (accept(parser, XmlPullParser.START_TAG, TAG_ADVANCED_OPTION)) {
+ String key = parser.getAttributeValue(null, ATTR_KEY);
+ String value = parser.getAttributeValue(null, ATTR_VALUE);
+ String type = parser.getAttributeValue(null, ATTR_TYPE);
+ if (TYPE_STRING.equals(type)) {
+ advancedOptions.putString(key, value);
+ } else if (TYPE_INT.equals(type)) {
+ advancedOptions.putInt(key, Integer.valueOf(value));
+ }
+ parser.next();
+ skipEmptyTextTags(parser);
+ expect(parser, XmlPullParser.END_TAG, TAG_ADVANCED_OPTION);
+ parser.next();
+ skipEmptyTextTags(parser);
+ }
+ printJob.setAdvancedOptions(advancedOptions);
+ skipEmptyTextTags(parser);
+ expect(parser, XmlPullParser.END_TAG, TAG_ADVANCED_OPTIONS);
+ parser.next();
+ }
+
mPrintJobs.add(printJob);
if (DEBUG_PERSISTENCE) {