diff options
4 files changed, 210 insertions, 123 deletions
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java index b1e427ed3d34..a1ffa8c65f62 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 de28bd3c8225..42bea6d1f5e4 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 1040edf6e66d..514e8cab67d8 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 0d539b0a335f..f15c7602f0b1 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;              }  |