summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/print/PrintAttributes.java12
-rw-r--r--core/java/android/print/PrintJob.java1
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java316
-rw-r--r--services/java/com/android/server/print/RemotePrintService.java4
4 files changed, 210 insertions, 123 deletions
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index b1e427e..a1ffa8c 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -226,6 +226,12 @@ public final class PrintAttributes implements Parcelable {
StringBuilder builder = new StringBuilder();
builder.append("PrintAttributes{");
builder.append("mediaSize: ").append(mMediaSize);
+ if (mMediaSize != null) {
+ builder.append(", orientation: ").append(mMediaSize.isPortrait()
+ ? "portrait" : "landscape");
+ } else {
+ builder.append(", orientation: ").append("null");
+ }
builder.append(", resolution: ").append(mResolution);
builder.append(", margins: ").append(mMargins);
builder.append(", colorMode: ").append(colorModeToString(mColorMode));
@@ -880,12 +886,6 @@ public final class PrintAttributes implements Parcelable {
* @param bottomMils The bottom margin in mils (thousands of an inch).
*/
public Margins(int leftMils, int topMils, int rightMils, int bottomMils) {
- if (leftMils > rightMils) {
- throw new IllegalArgumentException("leftMils cannot be less than rightMils.");
- }
- if (topMils > bottomMils) {
- throw new IllegalArgumentException("topMils cannot be less than bottomMils.");
- }
mTopMils = topMils;
mLeftMils = leftMils;
mRightMils = rightMils;
diff --git a/core/java/android/print/PrintJob.java b/core/java/android/print/PrintJob.java
index de28bd3..42bea6d 100644
--- a/core/java/android/print/PrintJob.java
+++ b/core/java/android/print/PrintJob.java
@@ -16,7 +16,6 @@
package android.print;
-
/**
* This class represents a print job from the perspective of
* an application.
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 1040edf..514e8ca 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -42,6 +42,7 @@ import android.print.IPrintDocumentAdapter;
import android.print.IWriteResultCallback;
import android.print.PageRange;
import android.print.PrintAttributes;
+import android.print.PrintAttributes.Margins;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Resolution;
import android.print.PrintDocumentAdapter;
@@ -341,7 +342,11 @@ public class PrintJobConfigActivity extends Activity {
if (!mController.hasStarted()) {
mController.start();
}
- if (!printAttributesChanged() && mDocument.info != null) {
+ if (!printAttributesChanged()) {
+ if (mDocument.info == null) {
+ // We are waiting for the result of a layout, so do nothing.
+ return;
+ }
// If the attributes didn't change and we have done a layout, then
// we do not do a layout but may have to ask the app to write some
// pages. Hence, pretend layout completed and nothing changed, so
@@ -738,6 +743,8 @@ public class PrintJobConfigActivity extends Activity {
private PrinterInfo mCurrentPrinter;
+ private boolean mRequestedCurrentPrinterRefresh;
+
private final OnItemSelectedListener mOnItemSelectedListener =
new AdapterView.OnItemSelectedListener() {
@Override
@@ -757,34 +764,34 @@ public class PrintJobConfigActivity extends Activity {
return;
}
- mCurrPrintAttributes.clear();
+ mRequestedCurrentPrinterRefresh = false;
- PrinterInfo printer = (PrinterInfo) mDestinationSpinnerAdapter
+ mCurrentPrinter = (PrinterInfo) mDestinationSpinnerAdapter
.getItem(position);
PrintSpoolerService.peekInstance().setPrintJobPrinterNoPersistence(
- mPrintJobId, printer);
+ mPrintJobId, mCurrentPrinter);
- if (printer != null) {
- PrinterCapabilitiesInfo capabilities = printer.getCapabilities();
- if (capabilities == null) {
- //TODO: We need a timeout for the update.
- mEditor.refreshCurrentPrinter();
- } else {
- capabilities.getDefaults(mCurrPrintAttributes);
- if (!mController.hasStarted()) {
- mController.start();
- }
- mController.update();
- }
+ if (mCurrentPrinter.getStatus() == PrinterInfo.STATUS_UNAVAILABLE) {
+ updateUi();
+ return;
}
- mCurrentPrinter = printer;
-
- updateUiForNewPrinterCapabilities();
+ PrinterCapabilitiesInfo capabilities = mCurrentPrinter.getCapabilities();
+ if (capabilities == null) {
+ // TODO: We need a timeout for the update.
+ mRequestedCurrentPrinterRefresh = true;
+ updateUi();
+ refreshCurrentPrinter();
+ } else {
+ updatePrintAttributes(capabilities);
+ updateUi();
+ mController.update();
+ }
} else if (spinner == mMediaSizeSpinner) {
- if (mIgnoreNextMediaSizeChange) {
- mIgnoreNextMediaSizeChange = false;
+ if (mOldMediaSizeSelectionIndex
+ == mMediaSizeSpinner.getSelectedItemPosition()) {
+ mOldMediaSizeSelectionIndex = AdapterView.INVALID_POSITION;
return;
}
SpinnerItem<MediaSize> mediaItem = mMediaSizeSpinnerAdapter.getItem(position);
@@ -793,8 +800,9 @@ public class PrintJobConfigActivity extends Activity {
mController.update();
}
} else if (spinner == mColorModeSpinner) {
- if (mIgnoreNextColorModeChange) {
- mIgnoreNextColorModeChange = false;
+ if (mOldColorModeSelectionIndex
+ == mColorModeSpinner.getSelectedItemPosition()) {
+ mOldColorModeSelectionIndex = AdapterView.INVALID_POSITION;
return;
}
SpinnerItem<Integer> colorModeItem =
@@ -810,16 +818,7 @@ public class PrintJobConfigActivity extends Activity {
}
SpinnerItem<Integer> orientationItem =
mOrientationSpinnerAdapter.getItem(position);
- MediaSize mediaSize = mCurrPrintAttributes.getMediaSize();
- if (orientationItem.value == ORIENTATION_PORTRAIT) {
- if (!mediaSize.isPortrait()) {
- mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait());
- }
- } else {
- if (mediaSize.isPortrait()) {
- mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape());
- }
- }
+ setCurrentPrintAttributesOrientation(orientationItem.value);
if (!hasErrors()) {
mController.update();
}
@@ -841,6 +840,105 @@ public class PrintJobConfigActivity extends Activity {
}
};
+ private void setCurrentPrintAttributesOrientation(int orientation) {
+ MediaSize mediaSize = mCurrPrintAttributes.getMediaSize();
+ if (orientation == ORIENTATION_PORTRAIT) {
+ if (!mediaSize.isPortrait()) {
+ // Rotate the media size.
+ mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait());
+
+ // Rotate the resolution.
+ Resolution oldResolution = mCurrPrintAttributes.getResolution();
+ Resolution newResolution = new Resolution(
+ oldResolution.getId(),
+ oldResolution.getLabel(getPackageManager()),
+ oldResolution.getVerticalDpi(),
+ oldResolution.getHorizontalDpi());
+ mCurrPrintAttributes.setResolution(newResolution);
+
+ // Rotate the physical margins.
+ Margins oldMargins = mCurrPrintAttributes.getMargins();
+ Margins newMargins = new Margins(
+ oldMargins.getBottomMils(),
+ oldMargins.getLeftMils(),
+ oldMargins.getTopMils(),
+ oldMargins.getRightMils());
+ mCurrPrintAttributes.setMargins(newMargins);
+ }
+ } else {
+ if (mediaSize.isPortrait()) {
+ // Rotate the media size.
+ mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape());
+
+ // Rotate the resolution.
+ Resolution oldResolution = mCurrPrintAttributes.getResolution();
+ Resolution newResolution = new Resolution(
+ oldResolution.getId(),
+ oldResolution.getLabel(getPackageManager()),
+ oldResolution.getVerticalDpi(),
+ oldResolution.getHorizontalDpi());
+ mCurrPrintAttributes.setResolution(newResolution);
+
+ // Rotate the physical margins.
+ Margins oldMargins = mCurrPrintAttributes.getMargins();
+ Margins newMargins = new Margins(
+ oldMargins.getTopMils(),
+ oldMargins.getRightMils(),
+ oldMargins.getBottomMils(),
+ oldMargins.getLeftMils());
+ mCurrPrintAttributes.setMargins(newMargins);
+ }
+ }
+ }
+
+ private void updatePrintAttributes(PrinterCapabilitiesInfo capabilities) {
+ PrintAttributes defaults = mTempPrintAttributes;
+ capabilities.getDefaults(defaults);
+
+ // Media size.
+ MediaSize currMediaSize = mCurrPrintAttributes.getMediaSize();
+ if (currMediaSize == null) {
+ mCurrPrintAttributes.setMediaSize(defaults.getMediaSize());
+ } else {
+ MediaSize currMediaSizePortrait = currMediaSize.asPortrait();
+ List<MediaSize> mediaSizes = capabilities.getMediaSizes();
+ final int mediaSizeCount = mediaSizes.size();
+ for (int i = 0; i < mediaSizeCount; i++) {
+ MediaSize mediaSize = mediaSizes.get(i);
+ if (currMediaSizePortrait.equals(mediaSize.asPortrait())) {
+ mCurrPrintAttributes.setMediaSize(mediaSize);
+ break;
+ }
+ }
+ }
+
+ // Color mode.
+ final int colorMode = mCurrPrintAttributes.getColorMode();
+ if ((capabilities.getColorModes() & colorMode) == 0) {
+ mCurrPrintAttributes.setColorMode(colorMode);
+ }
+
+ // Resolution
+ Resolution resolution = mCurrPrintAttributes.getResolution();
+ if (resolution == null || !capabilities.getResolutions().contains(resolution)) {
+ mCurrPrintAttributes.setResolution(defaults.getResolution());
+ }
+
+ // Margins.
+ Margins margins = mCurrPrintAttributes.getMargins();
+ if (margins == null) {
+ mCurrPrintAttributes.setMargins(defaults.getMargins());
+ } else {
+ Margins minMargins = capabilities.getMinMargins();
+ if (margins.getLeftMils() < minMargins.getLeftMils()
+ || margins.getTopMils() < minMargins.getTopMils()
+ || margins.getRightMils() > minMargins.getRightMils()
+ || margins.getBottomMils() > minMargins.getBottomMils()) {
+ mCurrPrintAttributes.setMargins(defaults.getMargins());
+ }
+ }
+ }
+
private final TextWatcher mCopiesTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
@@ -952,8 +1050,8 @@ public class PrintJobConfigActivity extends Activity {
private int mEditorState;
private boolean mIgnoreNextDestinationChange;
- private boolean mIgnoreNextMediaSizeChange;
- private boolean mIgnoreNextColorModeChange;
+ private int mOldMediaSizeSelectionIndex;
+ private int mOldColorModeSelectionIndex;
private boolean mIgnoreNextOrientationChange;
private boolean mIgnoreNextRangeOptionChange;
private boolean mIgnoreNextCopiesChange;
@@ -993,11 +1091,22 @@ public class PrintJobConfigActivity extends Activity {
// capabilities, we refresh it.
if (mCurrentPrinter.getStatus() == PrinterInfo.STATUS_UNAVAILABLE
&& printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE
- && printer.getCapabilities() == null) {
+ && printer.getCapabilities() == null
+ && !mRequestedCurrentPrinterRefresh) {
+ mRequestedCurrentPrinterRefresh = true;
refreshCurrentPrinter();
return;
}
+ // We just refreshed the current printer.
+ if (printer.getCapabilities() != null
+ && mRequestedCurrentPrinterRefresh) {
+ mRequestedCurrentPrinterRefresh = false;
+ updatePrintAttributes(printer.getCapabilities());
+ updateUi();
+ mController.update();
+ }
+
// Update the UI if capabilities changed.
boolean capabilitiesChanged = false;
@@ -1010,14 +1119,18 @@ public class PrintJobConfigActivity extends Activity {
capabilitiesChanged = true;
}
- if (capabilitiesChanged) {
- // Update the current printer.
+ // Update the UI if the status changed.
+ final boolean statusChanged = mCurrentPrinter.getStatus()
+ != printer.getStatus();
+
+ // Update the printer with the latest info.
+ if (!mCurrentPrinter.equals(printer)) {
mCurrentPrinter.copyFrom(printer);
+ }
- // If something changed during UI update...
+ if (capabilitiesChanged || statusChanged) {
+ // If something changed during update...
if (updateUi()) {
- // Update current attributes.
- printer.getCapabilities().getDefaults(mCurrPrintAttributes);
// Update the document.
mController.update();
}
@@ -1031,7 +1144,7 @@ public class PrintJobConfigActivity extends Activity {
@Override
public void onInvalidated() {
- updateUiForNewPrinterCapabilities();
+ /* do nothing - we always have one fake PDF printer */
}
});
@@ -1072,6 +1185,10 @@ public class PrintJobConfigActivity extends Activity {
showUi(UI_EDITING_PRINT_JOB, null);
bindUi();
+
+ mCurrentPrinter = mDestinationSpinnerAdapter.mFakePdfPrinter;
+ updatePrintAttributes(mCurrentPrinter.getCapabilities());
+
updateUi();
}
@@ -1393,7 +1510,7 @@ public class PrintJobConfigActivity extends Activity {
mMediaSizeSpinner.setAdapter(mMediaSizeSpinnerAdapter);
mMediaSizeSpinner.setOnItemSelectedListener(mOnItemSelectedListener);
if (mMediaSizeSpinnerAdapter.getCount() > 0) {
- mIgnoreNextMediaSizeChange = true;
+ mOldMediaSizeSelectionIndex = 0;
}
// Color mode.
@@ -1401,7 +1518,7 @@ public class PrintJobConfigActivity extends Activity {
mColorModeSpinner.setAdapter(mColorModeSpinnerAdapter);
mColorModeSpinner.setOnItemSelectedListener(mOnItemSelectedListener);
if (mColorModeSpinnerAdapter.getCount() > 0) {
- mIgnoreNextColorModeChange = true;
+ mOldColorModeSelectionIndex = 0;
}
// Orientation
@@ -1454,7 +1571,8 @@ public class PrintJobConfigActivity extends Activity {
Object item = mDestinationSpinnerAdapter.getItem(selectedIndex);
if (item instanceof PrinterInfo) {
PrinterInfo printer = (PrinterInfo) item;
- if (printer.getCapabilities() != null) {
+ if (printer.getCapabilities() != null
+ && printer.getStatus() != PrinterInfo.STATUS_UNAVAILABLE) {
allOptionsEnabled = true;
}
}
@@ -1470,14 +1588,14 @@ public class PrintJobConfigActivity extends Activity {
// Media size
if (mMediaSizeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) {
- mIgnoreNextMediaSizeChange = true;
+ mOldMediaSizeSelectionIndex = AdapterView.INVALID_POSITION;
mMediaSizeSpinner.setSelection(AdapterView.INVALID_POSITION);
}
mMediaSizeSpinner.setEnabled(false);
// Color mode
if (mColorModeSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) {
- mIgnoreNextColorModeChange = true;
+ mOldColorModeSelectionIndex = AdapterView.INVALID_POSITION;
mColorModeSpinner.setSelection(AdapterView.INVALID_POSITION);
}
mColorModeSpinner.setEnabled(false);
@@ -1513,9 +1631,9 @@ public class PrintJobConfigActivity extends Activity {
} else {
boolean someAttributeSelectionChanged = false;
- PrintAttributes defaultAttributes = mTempPrintAttributes;
PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem();
PrinterCapabilitiesInfo capabilities = printer.getCapabilities();
+ PrintAttributes defaultAttributes = mTempPrintAttributes;
printer.getCapabilities().getDefaults(defaultAttributes);
// Media size.
@@ -1551,25 +1669,19 @@ public class PrintJobConfigActivity extends Activity {
mediaSize, mediaSize.getLabel(getPackageManager())));
}
- if (mediaSizeCount <= 0) {
- // No media sizes - clear the selection.
- mMediaSizeSpinner.setEnabled(false);
- // Clear selection and mark if selection changed.
- someAttributeSelectionChanged = setMediaSizeSpinnerSelectionNoCallback(
- AdapterView.INVALID_POSITION);
- } else {
- mMediaSizeSpinner.setEnabled(true);
+ mMediaSizeSpinner.setEnabled(true);
- if (oldMediaSizeNewIndex != AdapterView.INVALID_POSITION) {
- // Select the old media size - nothing really changed.
- setMediaSizeSpinnerSelectionNoCallback(oldMediaSizeNewIndex);
- } else {
- // Select the first or the default and mark if selection changed.
- final int mediaSizeIndex = Math.max(mediaSizes.indexOf(
- defaultAttributes.getMediaSize()), 0);
- someAttributeSelectionChanged = setMediaSizeSpinnerSelectionNoCallback(
- mediaSizeIndex);
- }
+ if (oldMediaSizeNewIndex != AdapterView.INVALID_POSITION) {
+ // Select the old media size - nothing really changed.
+ setMediaSizeSpinnerSelectionNoCallback(oldMediaSizeNewIndex);
+ } else {
+ // Select the first or the default and mark if selection changed.
+ final int mediaSizeIndex = Math.max(mediaSizes.indexOf(
+ defaultAttributes.getMediaSize()), 0);
+ setMediaSizeSpinnerSelectionNoCallback(mediaSizeIndex);
+ mCurrPrintAttributes.setMediaSize(mMediaSizeSpinnerAdapter
+ .getItem(mediaSizeIndex).value);
+ someAttributeSelectionChanged = true;
}
}
mMediaSizeSpinner.setEnabled(true);
@@ -1618,26 +1730,32 @@ public class PrintJobConfigActivity extends Activity {
mColorModeSpinnerAdapter.add(new SpinnerItem<Integer>(colorMode,
colorModeLabels[colorBitOffset]));
}
- final int colorModeCount = Integer.bitCount(colorModes);
- if (colorModeCount <= 0) {
- mColorModeSpinner.setEnabled(false);
- mColorModeSpinner.setSelection(AdapterView.INVALID_POSITION);
+ mColorModeSpinner.setEnabled(true);
+ if (oldColorModeNewIndex != AdapterView.INVALID_POSITION) {
+ // Select the old color mode - nothing really changed.
+ setColorModeSpinnerSelectionNoCallback(oldColorModeNewIndex);
} else {
- mColorModeSpinner.setEnabled(true);
- if (oldColorModeNewIndex != AdapterView.INVALID_POSITION) {
- // Select the old color mode - nothing really changed.
- setColorModeSpinnerSelectionNoCallback(oldColorModeNewIndex);
- } else {
- final int selectedColorModeIndex = Integer.numberOfTrailingZeros(
+ final int selectedColorModeIndex = Integer.numberOfTrailingZeros(
(colorModes & defaultAttributes.getColorMode()));
- someAttributeSelectionChanged = setColorModeSpinnerSelectionNoCallback(
- selectedColorModeIndex);
- }
+ setColorModeSpinnerSelectionNoCallback(selectedColorModeIndex);
+ mCurrPrintAttributes.setColorMode(mColorModeSpinnerAdapter
+ .getItem(selectedColorModeIndex).value);
+ someAttributeSelectionChanged = true;
}
}
mColorModeSpinner.setEnabled(true);
// Orientation
+ MediaSize mediaSize = mCurrPrintAttributes.getMediaSize();
+ if (mediaSize.isPortrait()
+ && mOrientationSpinner.getSelectedItemPosition() != 0) {
+ mIgnoreNextOrientationChange = true;
+ mOrientationSpinner.setSelection(0);
+ } else if (!mediaSize.isPortrait()
+ && mOrientationSpinner.getSelectedItemPosition() != 1) {
+ mIgnoreNextOrientationChange = true;
+ mOrientationSpinner.setSelection(1);
+ }
mOrientationSpinner.setEnabled(true);
// Range options
@@ -1723,50 +1841,18 @@ public class PrintJobConfigActivity extends Activity {
}
}
- private boolean setMediaSizeSpinnerSelectionNoCallback(int position) {
+ private void setMediaSizeSpinnerSelectionNoCallback(int position) {
if (mMediaSizeSpinner.getSelectedItemPosition() != position) {
- mIgnoreNextMediaSizeChange = true;
+ mOldMediaSizeSelectionIndex = position;
mMediaSizeSpinner.setSelection(position);
- return true;
}
- return false;
}
- private boolean setColorModeSpinnerSelectionNoCallback(int position) {
+ private void setColorModeSpinnerSelectionNoCallback(int position) {
if (mColorModeSpinner.getSelectedItemPosition() != position) {
- mIgnoreNextColorModeChange = true;
+ mOldColorModeSelectionIndex = position;
mColorModeSpinner.setSelection(position);
- return true;
- }
- return false;
- }
-
- private void updateUiForNewPrinterCapabilities() {
- // The printer changed so we want to start with a clean slate
- // for the print options and let them be populated from the
- // printer capabilities and use the printer defaults.
- if (!mMediaSizeSpinnerAdapter.isEmpty()) {
- mIgnoreNextMediaSizeChange = true;
- mMediaSizeSpinnerAdapter.clear();
- }
- if (!mColorModeSpinnerAdapter.isEmpty()) {
- mIgnoreNextColorModeChange = true;
- mColorModeSpinnerAdapter.clear();
- }
- if (mOrientationSpinner.getSelectedItemPosition() != 0) {
- mIgnoreNextOrientationChange = true;
- mOrientationSpinner.setSelection(0);
- }
- if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
- mIgnoreNextRangeOptionChange = true;
- mRangeOptionsSpinner.setSelection(0);
- }
- if (!TextUtils.isEmpty(mCopiesEditText.getText())) {
- mIgnoreNextCopiesChange = true;
- mCopiesEditText.setText(MIN_COPIES_STRING);
}
-
- updateUi();
}
private void startSelectPrinterActivity() {
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index 0d539b0..f15c760 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -447,7 +447,9 @@ final class RemotePrintService implements DeathRecipient {
Slog.i(LOG_TAG, "[user: " + mUserId + "] stopPrinterTracking()");
}
// We are no longer tracking the printer.
- mTrackedPrinterList.remove(printerId);
+ if (mTrackedPrinterList == null || !mTrackedPrinterList.remove(printerId)) {
+ return;
+ }
if (mTrackedPrinterList.isEmpty()) {
mTrackedPrinterList = null;
}