diff options
-rw-r--r-- | api/current.txt | 138 | ||||
-rw-r--r-- | core/java/android/print/IPrinterDiscoveryObserver.aidl | 1 | ||||
-rw-r--r-- | core/java/android/print/PrintAttributes.java | 1253 | ||||
-rw-r--r-- | core/java/android/print/PrintDocumentAdapter.java | 22 | ||||
-rw-r--r-- | core/java/android/print/PrintDocumentInfo.java | 239 | ||||
-rw-r--r-- | core/java/android/print/PrinterCapabilitiesInfo.java | 418 | ||||
-rw-r--r-- | core/java/android/print/PrinterDiscoverySession.java | 38 | ||||
-rw-r--r-- | core/java/android/printservice/IPrintServiceClient.aidl | 1 | ||||
-rw-r--r-- | core/java/android/printservice/PrinterDiscoverySession.java | 168 | ||||
-rw-r--r-- | core/java/android/provider/Settings.java | 14 | ||||
-rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java | 178 | ||||
-rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java | 118 | ||||
-rw-r--r-- | services/java/com/android/server/print/RemotePrintService.java | 14 | ||||
-rw-r--r-- | services/java/com/android/server/print/UserState.java | 102 |
14 files changed, 535 insertions, 2169 deletions
diff --git a/api/current.txt b/api/current.txt index 063f6da..3887630 100644 --- a/api/current.txt +++ b/api/current.txt @@ -19040,39 +19040,21 @@ package android.print { method public void clear(); method public int describeContents(); method public int getColorMode(); - method public int getDuplexMode(); - method public int getFittingMode(); - method public android.print.PrintAttributes.Tray getInputTray(); method public android.print.PrintAttributes.Margins getMargins(); method public android.print.PrintAttributes.MediaSize getMediaSize(); - method public int getOrientation(); - method public android.print.PrintAttributes.Tray getOutputTray(); method public android.print.PrintAttributes.Resolution getResolution(); method public void writeToParcel(android.os.Parcel, int); field public static final int COLOR_MODE_COLOR = 2; // 0x2 field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1 field public static final android.os.Parcelable.Creator CREATOR; - field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2 - field public static final int DUPLEX_MODE_NONE = 1; // 0x1 - field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4 - field public static final int FITTING_MODE_NONE = 1; // 0x1 - field public static final int FITTING_MODE_SCALE_TO_FILL = 4; // 0x4 - field public static final int FITTING_MODE_SCALE_TO_FIT = 2; // 0x2 - field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2 - field public static final int ORIENTATION_PORTRAIT = 1; // 0x1 } public static final class PrintAttributes.Builder { ctor public PrintAttributes.Builder(); method public android.print.PrintAttributes create(); method public android.print.PrintAttributes.Builder setColorMode(int); - method public android.print.PrintAttributes.Builder setDuplexMode(int); - method public android.print.PrintAttributes.Builder setFittingMode(int); - method public android.print.PrintAttributes.Builder setInputTray(android.print.PrintAttributes.Tray); method public android.print.PrintAttributes.Builder setMargins(android.print.PrintAttributes.Margins); method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize); - method public android.print.PrintAttributes.Builder setOrientation(int); - method public android.print.PrintAttributes.Builder setOutputTray(android.print.PrintAttributes.Tray); method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution); } @@ -19086,67 +19068,65 @@ package android.print { } public static final class PrintAttributes.MediaSize { + ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int, int); ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int); - method public static android.print.PrintAttributes.MediaSize createMediaSize(android.content.pm.PackageManager, int); + method public android.print.PrintAttributes.MediaSize asLandscape(); + method public android.print.PrintAttributes.MediaSize asPortrait(); method public int getHeightMils(); method public java.lang.String getId(); - method public java.lang.String getLabel(); + method public java.lang.String getLabel(android.content.pm.PackageManager); method public int getWidthMils(); - field public static final int ISO_A0 = 1; // 0x1 - field public static final int ISO_A1 = 2; // 0x2 - field public static final int ISO_A10 = 11; // 0xb - field public static final int ISO_A2 = 3; // 0x3 - field public static final int ISO_A3 = 4; // 0x4 - field public static final int ISO_A4 = 5; // 0x5 - field public static final int ISO_A5 = 6; // 0x6 - field public static final int ISO_A6 = 7; // 0x7 - field public static final int ISO_A7 = 8; // 0x8 - field public static final int ISO_A8 = 9; // 0x9 - field public static final int ISO_A9 = 10; // 0xa - field public static final int ISO_B0 = 100; // 0x64 - field public static final int ISO_B1 = 101; // 0x65 - field public static final int ISO_B10 = 110; // 0x6e - field public static final int ISO_B2 = 102; // 0x66 - field public static final int ISO_B3 = 103; // 0x67 - field public static final int ISO_B4 = 104; // 0x68 - field public static final int ISO_B5 = 105; // 0x69 - field public static final int ISO_B6 = 106; // 0x6a - field public static final int ISO_B7 = 107; // 0x6b - field public static final int ISO_B8 = 108; // 0x6c - field public static final int ISO_B9 = 109; // 0x6d - field public static final int ISO_C0 = 200; // 0xc8 - field public static final int ISO_C1 = 201; // 0xc9 - field public static final int ISO_C10 = 210; // 0xd2 - field public static final int ISO_C2 = 202; // 0xca - field public static final int ISO_C3 = 203; // 0xcb - field public static final int ISO_C4 = 204; // 0xcc - field public static final int ISO_C5 = 205; // 0xcd - field public static final int ISO_C6 = 206; // 0xce - field public static final int ISO_C7 = 207; // 0xcf - field public static final int ISO_C8 = 208; // 0xd0 - field public static final int ISO_C9 = 209; // 0xd1 - field public static final int NA_GOVT_LETTER = 301; // 0x12d - field public static final int NA_JUNIOR_LEGAL = 303; // 0x12f - field public static final int NA_LEDGER = 304; // 0x130 - field public static final int NA_LEGAL = 302; // 0x12e - field public static final int NA_LETTER = 300; // 0x12c - field public static final int NA_TBLOID = 305; // 0x131 + method public boolean isPortrait(); + field public static final android.print.PrintAttributes.MediaSize ISO_A0; + field public static final android.print.PrintAttributes.MediaSize ISO_A1; + field public static final android.print.PrintAttributes.MediaSize ISO_A10; + field public static final android.print.PrintAttributes.MediaSize ISO_A2; + field public static final android.print.PrintAttributes.MediaSize ISO_A3; + field public static final android.print.PrintAttributes.MediaSize ISO_A4; + field public static final android.print.PrintAttributes.MediaSize ISO_A5; + field public static final android.print.PrintAttributes.MediaSize ISO_A6; + field public static final android.print.PrintAttributes.MediaSize ISO_A7; + field public static final android.print.PrintAttributes.MediaSize ISO_A8; + field public static final android.print.PrintAttributes.MediaSize ISO_A9; + field public static final android.print.PrintAttributes.MediaSize ISO_B0; + field public static final android.print.PrintAttributes.MediaSize ISO_B1; + field public static final android.print.PrintAttributes.MediaSize ISO_B10; + field public static final android.print.PrintAttributes.MediaSize ISO_B2; + field public static final android.print.PrintAttributes.MediaSize ISO_B3; + field public static final android.print.PrintAttributes.MediaSize ISO_B4; + field public static final android.print.PrintAttributes.MediaSize ISO_B5; + field public static final android.print.PrintAttributes.MediaSize ISO_B6; + field public static final android.print.PrintAttributes.MediaSize ISO_B7; + field public static final android.print.PrintAttributes.MediaSize ISO_B8; + field public static final android.print.PrintAttributes.MediaSize ISO_B9; + field public static final android.print.PrintAttributes.MediaSize ISO_C0; + field public static final android.print.PrintAttributes.MediaSize ISO_C1; + field public static final android.print.PrintAttributes.MediaSize ISO_C10; + field public static final android.print.PrintAttributes.MediaSize ISO_C2; + field public static final android.print.PrintAttributes.MediaSize ISO_C3; + field public static final android.print.PrintAttributes.MediaSize ISO_C4; + field public static final android.print.PrintAttributes.MediaSize ISO_C5; + field public static final android.print.PrintAttributes.MediaSize ISO_C6; + field public static final android.print.PrintAttributes.MediaSize ISO_C7; + field public static final android.print.PrintAttributes.MediaSize ISO_C8; + field public static final android.print.PrintAttributes.MediaSize ISO_C9; + field public static final android.print.PrintAttributes.MediaSize NA_GOVT_LETTER; + field public static final android.print.PrintAttributes.MediaSize NA_JUNIOR_LEGAL; + field public static final android.print.PrintAttributes.MediaSize NA_LEDGER; + field public static final android.print.PrintAttributes.MediaSize NA_LEGAL; + field public static final android.print.PrintAttributes.MediaSize NA_LETTER; + field public static final android.print.PrintAttributes.MediaSize NA_TBLOID; } public static final class PrintAttributes.Resolution { + ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int, int); ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int); method public int getHorizontalDpi(); method public java.lang.String getId(); - method public java.lang.String getLabel(); + method public java.lang.String getLabel(android.content.pm.PackageManager); method public int getVerticalDpi(); } - public static final class PrintAttributes.Tray { - ctor public PrintAttributes.Tray(java.lang.String, java.lang.String); - method public java.lang.String getId(); - method public java.lang.String getLabel(); - } - public abstract class PrintDocumentAdapter { ctor public PrintDocumentAdapter(); method public void onFinish(); @@ -19170,34 +19150,22 @@ package android.print { public final class PrintDocumentInfo implements android.os.Parcelable { method public int describeContents(); - method public int getColorMode(); method public int getContentType(); method public long getDataSize(); - method public int getFittingMode(); - method public android.print.PrintAttributes.Margins getMargins(); - method public android.print.PrintAttributes.MediaSize getMediaSize(); method public java.lang.String getName(); - method public int getOrientation(); method public int getPageCount(); method public void writeToParcel(android.os.Parcel, int); field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0 field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1 field public static final int CONTENT_TYPE_UNKNOWN = -1; // 0xffffffff field public static final android.os.Parcelable.Creator CREATOR; - field public static final android.print.PrintAttributes.MediaSize MEDIA_SIZE_UNKNOWN; field public static final int PAGE_COUNT_UNKNOWN = -1; // 0xffffffff } public static final class PrintDocumentInfo.Builder { - ctor public PrintDocumentInfo.Builder(java.lang.String, android.print.PrintAttributes); ctor public PrintDocumentInfo.Builder(java.lang.String); method public android.print.PrintDocumentInfo create(); - method public android.print.PrintDocumentInfo.Builder setColorMode(int); method public android.print.PrintDocumentInfo.Builder setContentType(int); - method public android.print.PrintDocumentInfo.Builder setFittingMode(int); - method public android.print.PrintDocumentInfo.Builder setMargins(android.print.PrintAttributes.Margins); - method public android.print.PrintDocumentInfo.Builder setMediaSize(android.print.PrintAttributes.MediaSize); - method public android.print.PrintDocumentInfo.Builder setOrientation(int); method public android.print.PrintDocumentInfo.Builder setPageCount(int); } @@ -19244,13 +19212,8 @@ package android.print { method public int describeContents(); method public int getColorModes(); method public void getDefaults(android.print.PrintAttributes); - method public int getDuplexModes(); - method public int getFittingModes(); - method public java.util.List<android.print.PrintAttributes.Tray> getInputTrays(); method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes(); method public android.print.PrintAttributes.Margins getMinMargins(); - method public int getOrientations(); - method public java.util.List<android.print.PrintAttributes.Tray> getOutputTrays(); method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; @@ -19258,16 +19221,11 @@ package android.print { public static final class PrinterCapabilitiesInfo.Builder { ctor public PrinterCapabilitiesInfo.Builder(android.print.PrinterId); - method public android.print.PrinterCapabilitiesInfo.Builder addInputTray(android.print.PrintAttributes.Tray, boolean); method public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(android.print.PrintAttributes.MediaSize, boolean); - method public android.print.PrinterCapabilitiesInfo.Builder addOutputTray(android.print.PrintAttributes.Tray, boolean); method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean); method public android.print.PrinterCapabilitiesInfo create(); method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int); - method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int); - method public android.print.PrinterCapabilitiesInfo.Builder setFittingModes(int, int); method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins, android.print.PrintAttributes.Margins); - method public android.print.PrinterCapabilitiesInfo.Builder setOrientations(int, int); } public final class PrinterId implements android.os.Parcelable { @@ -19388,6 +19346,7 @@ package android.printservice { ctor public PrinterDiscoverySession(); method public final void addPrinters(java.util.List<android.print.PrinterInfo>); method public final java.util.List<android.print.PrinterInfo> getPrinters(); + method public final java.util.List<android.print.PrinterId> getTrackedPrinters(); method public final boolean isDestroyed(); method public final boolean isPrinterDiscoveryStarted(); method public abstract void onDestroy(); @@ -19397,7 +19356,6 @@ package android.printservice { method public abstract void onStopPrinterStateTracking(android.print.PrinterId); method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>); method public final void removePrinters(java.util.List<android.print.PrinterId>); - method public final void updatePrinters(java.util.List<android.print.PrinterInfo>); } } @@ -21279,6 +21237,7 @@ package android.provider { field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS"; field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS"; field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS"; + field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS"; field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS"; @@ -27162,6 +27121,7 @@ package android.view { public class ScaleGestureDetector { ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener); + ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener, android.os.Handler); method public float getCurrentSpan(); method public float getCurrentSpanX(); method public float getCurrentSpanY(); diff --git a/core/java/android/print/IPrinterDiscoveryObserver.aidl b/core/java/android/print/IPrinterDiscoveryObserver.aidl index 625f383..71198f7 100644 --- a/core/java/android/print/IPrinterDiscoveryObserver.aidl +++ b/core/java/android/print/IPrinterDiscoveryObserver.aidl @@ -28,5 +28,4 @@ import android.print.PrinterInfo; oneway interface IPrinterDiscoveryObserver { void onPrintersAdded(in List<PrinterInfo> printers); void onPrintersRemoved(in List<PrinterId> printerIds); - void onPrintersUpdated(in List<PrinterInfo> printerIds); } diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java index caa10ae..f975ebd 100644 --- a/core/java/android/print/PrintAttributes.java +++ b/core/java/android/print/PrintAttributes.java @@ -18,10 +18,11 @@ package android.print; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.Log; import com.android.internal.R; @@ -29,60 +30,20 @@ import com.android.internal.R; * This class represents the attributes of a print job. */ public final class PrintAttributes implements Parcelable { - /** Duplex mode: No duplexing */ - public static final int DUPLEX_MODE_NONE = 1 << 0; - /** Duplex mode: Turn a page along its long edge, e.g. like a book */ - public static final int DUPLEX_MODE_LONG_EDGE = 1 << 1; - /** Duplex mode: Turn a page along its short edge, e.g. like a notepad */ - public static final int DUPLEX_MODE_SHORT_EDGE = 1 << 2; - - - /** Orientation: Portrait page orientation. */ - public static final int ORIENTATION_PORTRAIT = 1 << 0; - /** Orientation: Landscape page orientation. */ - public static final int ORIENTATION_LANDSCAPE = 1 << 1; - /** Color mode: Monochrome color scheme, e.g. one color is used. */ public static final int COLOR_MODE_MONOCHROME = 1 << 0; /** Color mode: Color color scheme, e.g. many colors are used. */ public static final int COLOR_MODE_COLOR = 1 << 1; - - /** Fitting mode: No fitting. */ - public static final int FITTING_MODE_NONE = 1 << 0; - /** Fitting mode: Scale the content to fit in the page - * without cropping it in any dimension. */ - public static final int FITTING_MODE_SCALE_TO_FIT = 1 << 1; - /** - * Fitting mode: Uniformly scale the content to fill the entire page - * potentially cropping the content if it overflows in one dimension. - */ - public static final int FITTING_MODE_SCALE_TO_FILL = 1 << 2; - - - private static final int VALID_DUPLEX_MODES = - DUPLEX_MODE_NONE | DUPLEX_MODE_LONG_EDGE | DUPLEX_MODE_SHORT_EDGE; - private static final int VALID_COLOR_MODES = COLOR_MODE_MONOCHROME | COLOR_MODE_COLOR; - private static final int VALID_FITTING_MODES = - FITTING_MODE_NONE | FITTING_MODE_SCALE_TO_FIT | FITTING_MODE_SCALE_TO_FILL; - - private static final int VALID_ORIENTATIONS = - ORIENTATION_PORTRAIT | ORIENTATION_LANDSCAPE; - private MediaSize mMediaSize; private Resolution mResolution; private Margins mMargins; - private Tray mInputTray; - private Tray mOutputTray; - private int mDuplexMode; private int mColorMode; - private int mFittingMode; - private int mOrientation; PrintAttributes() { /* hide constructor */ @@ -92,12 +53,7 @@ public final class PrintAttributes implements Parcelable { mMediaSize = (parcel.readInt() == 1) ? MediaSize.createFromParcel(parcel) : null; mResolution = (parcel.readInt() == 1) ? Resolution.createFromParcel(parcel) : null; mMargins = (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null; - mInputTray = (parcel.readInt() == 1) ? Tray.createFromParcel(parcel) : null; - mOutputTray = (parcel.readInt() == 1) ? Tray.createFromParcel(parcel) : null; - mDuplexMode = parcel.readInt(); mColorMode = parcel.readInt(); - mFittingMode = parcel.readInt(); - mOrientation = parcel.readInt(); } /** @@ -161,71 +117,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the input tray. - * - * @return The input tray or <code>null</code> if not set. - */ - public Tray getInputTray() { - return mInputTray; - } - - /** - * Gets the input tray. - * - * @param The input tray. - * - * @hide - */ - public void setInputTray(Tray inputTray) { - mInputTray = inputTray; - } - - /** - * Gets the output tray. - * - * @return The output tray or <code>null</code> if not set. - */ - public Tray getOutputTray() { - return mOutputTray; - } - - /** - * Sets the output tray. - * - * @param The output tray. - * - * @hide - */ - public void setOutputTray(Tray outputTray) { - mOutputTray = outputTray; - } - - /** - * Gets the duplex mode. - * - * @return The duplex mode or zero if not set. - * - * @see #DUPLEX_MODE_NONE - * @see #DUPLEX_MODE_SHORT_EDGE - * @see #DUPLEX_MODE_LONG_EDGE - */ - public int getDuplexMode() { - return mDuplexMode; - } - - /** - * Sets the duplex mode. - * - * @param The duplex mode. - * - * @hide - */ - public void setDuplexMode(int duplexMode) { - enforceValidDuplexMode(duplexMode); - mDuplexMode = duplexMode; - } - - /** * Gets the color mode. * * @return The color mode or zero if not set. @@ -252,62 +143,6 @@ public final class PrintAttributes implements Parcelable { mColorMode = colorMode; } - /** - * Gets the fitting mode. - * - * @return The fitting mode or zero if not set. - * - * @see #FITTING_MODE_NONE - * @see #FITTING_MODE_SCALE_TO_FILL - * @see #FITTING_MODE_SCALE_TO_FIT - */ - public int getFittingMode() { - return mFittingMode; - } - - /** - * Sets the fitting mode. - * - * @param The fitting mode. - * - * @see #FITTING_MODE_NONE - * @see #FITTING_MODE_SCALE_TO_FILL - * @see #FITTING_MODE_SCALE_TO_FIT - * - * @hide - */ - public void setFittingMode(int fittingMode) { - enforceValidFittingMode(fittingMode); - mFittingMode = fittingMode; - } - - /** - * Gets the orientation. - * - * @return The orientation or zero if not set. - * - * @see #ORIENTATION_PORTRAIT - * @see #ORIENTATION_LANDSCAPE - */ - public int getOrientation() { - return mOrientation; - } - - /** - * Sets the orientation. - * - * @param The orientation. - * - * @see #ORIENTATION_PORTRAIT - * @see #ORIENTATION_LANDSCAPE - * - * @hide - */ - public void setOrientation(int orientation) { - enforceValidOrientation(orientation); - mOrientation = orientation; - } - @Override public void writeToParcel(Parcel parcel, int flags) { if (mMediaSize != null) { @@ -328,22 +163,7 @@ public final class PrintAttributes implements Parcelable { } else { parcel.writeInt(0); } - if (mInputTray != null) { - parcel.writeInt(1); - mInputTray.writeToParcel(parcel); - } else { - parcel.writeInt(0); - } - if (mOutputTray != null) { - parcel.writeInt(1); - mOutputTray.writeToParcel(parcel); - } else { - parcel.writeInt(0); - } - parcel.writeInt(mDuplexMode); parcel.writeInt(mColorMode); - parcel.writeInt(mFittingMode); - parcel.writeInt(mOrientation); } @Override @@ -356,13 +176,8 @@ public final class PrintAttributes implements Parcelable { final int prime = 31; int result = 1; result = prime * result + mColorMode; - result = prime * result + mDuplexMode; - result = prime * result + mFittingMode; - result = prime * result + mOrientation; - result = prime * result + ((mInputTray == null) ? 0 : mInputTray.hashCode()); result = prime * result + ((mMargins == null) ? 0 : mMargins.hashCode()); result = prime * result + ((mMediaSize == null) ? 0 : mMediaSize.hashCode()); - result = prime * result + ((mOutputTray == null) ? 0 : mOutputTray.hashCode()); result = prime * result + ((mResolution == null) ? 0 : mResolution.hashCode()); return result; } @@ -382,29 +197,6 @@ public final class PrintAttributes implements Parcelable { if (mColorMode != other.mColorMode) { return false; } - if (mDuplexMode != other.mDuplexMode) { - return false; - } - if (mFittingMode != other.mFittingMode) { - return false; - } - if (mOrientation != other.mOrientation) { - return false; - } - if (mInputTray == null) { - if (other.mInputTray != null) { - return false; - } - } else if (!mInputTray.equals(other.mInputTray)) { - return false; - } - if (mOutputTray == null) { - if (other.mOutputTray != null) { - return false; - } - } else if (!mOutputTray.equals(other.mOutputTray)) { - return false; - } if (mMargins == null) { if (other.mMargins != null) { return false; @@ -436,12 +228,7 @@ public final class PrintAttributes implements Parcelable { builder.append("mediaSize: ").append(mMediaSize); builder.append(", resolution: ").append(mResolution); builder.append(", margins: ").append(mMargins); - builder.append(", inputTray: ").append(mInputTray); - builder.append(", outputTray: ").append(mOutputTray); builder.append(", colorMode: ").append(colorModeToString(mColorMode)); - builder.append(", duplexMode: ").append(duplexModeToString(mDuplexMode)); - builder.append(", fittingMode: ").append(fittingModeToString(mFittingMode)); - builder.append(", orientation: ").append(orientationToString(mOrientation)); builder.append("}"); return builder.toString(); } @@ -451,12 +238,7 @@ public final class PrintAttributes implements Parcelable { mMediaSize = null; mResolution = null; mMargins = null; - mInputTray = null; - mOutputTray = null; - mDuplexMode = 0; mColorMode = 0; - mFittingMode = 0; - mOrientation = 0; } /** @@ -466,485 +248,201 @@ public final class PrintAttributes implements Parcelable { mMediaSize = other.mMediaSize; mResolution = other.mResolution; mMargins = other.mMargins; - mInputTray = other.mInputTray; - mOutputTray = other.mOutputTray; - mDuplexMode = other.mDuplexMode; mColorMode = other.mColorMode; - mFittingMode = other.mFittingMode; - mOrientation = other.mOrientation; } /** * This class specifies a supported media size. */ public static final class MediaSize { + private static final String LOG_TAG = "MediaSize"; // TODO: Verify media sizes and add more standard ones. // ISO sizes - /** - * ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A0 = 1; - - /** - * ISO A1 media size: 594mm x 841mm (23.39" x 33.11") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A1 = 2; - - /** - * - *ISO A2 media size: 420mm x 594mm (16.54" x 23.39") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A2 = 3; - - /** - * ISO A3 media size: 297mm x 420mm (11.69" x 16.54") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A3 = 4; - - /** - * ISO A4 media size: 210mm x 297mm (8.27" x 11.69") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A4 = 5; - - /** - * ISO A5 media size: 148mm x 210mm (5.83" x 8.27") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A5 = 6; - - /** - * ISO A6 media size: 105mm x 148mm (4.13" x 5.83") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A6 = 7; - - /** - * ISO A7 media size: 74mm x 105mm (2.91" x 4.13") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A7 = 8; - - /** - * ISO A8 media size: 52mm x 74mm (2.05" x 2.91") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A8 = 9; - - /** - * ISO A9 media size: 37mm x 52mm (1.46" x 2.05") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A9 = 10; - - /** - * ISO A10 media size: 26mm x 37mm (1.02" x 1.46") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A10 = 11; - - - /** - * ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B0 = 100; - - /** - * ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B1 = 101; - - /** - * ISO B2 media size: 500mm x 707mm (19.69" x 27.83") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B2 = 102; - - /** - * ISO B3 media size: 353mm x 500mm (13.90" x 19.69") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B3 = 103; - - /** - * ISO B4 media size: 250mm x 353mm (9.84" x 13.90") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B4 = 104; - - /** - * ISO B5 media size: 176mm x 250mm (6.93" x 9.84") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B5 = 105; - - /** - * ISO B6 media size: 125mm x 176mm (4.92" x 6.93") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B6 = 106; - - /** - * ISO B7 media size: 88mm x 125mm (3.46" x 4.92") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B7 = 107; - - /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B8 = 108; - - /** - * ISO B9 media size: 44mm x 62mm (1.73" x 2.44") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B9 = 109; - - /** - * ISO B10 media size: 31mm x 44mm (1.22" x 1.73") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B10 = 110; - - - /** - * ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C0 = 200; - - /** - * ISO C1 media size: 648mm x 917mm (25.51" x 36.10") - * - * @see #createMediaSize(PackageManager, int) - */ - - public static final int ISO_C1 = 201; - /** - * ISO C2 media size: 458mm x 648mm (18.03" x 25.51") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C2 = 202; - - /** - * ISO C3 media size: 324mm x 458mm (12.76" x 18.03") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C3 = 203; - - /** - * ISO C4 media size: 229mm x 324mm (9.02" x 12.76") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C4 = 204; - - /** - * ISO C5 media size: 162mm x 229mm (6.38" x 9.02") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C5 = 205; - - /** - * ISO C6 media size: 114mm x 162mm (4.49" x 6.38") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C6 = 206; - - /** - * ISO C7 media size: 81mm x 114mm (3.19" x 4.49") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C7 = 207; - - /** - * ISO C8 media size: 57mm x 81mm (2.24" x 3.19") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C8 = 208; - - /** - * ISO C9 media size: 40mm x 57mm (1.57" x 2.24") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C9 = 209; - - /** - * ISO C10 media size: 28mm x 40mm (1.10" x 1.57") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C10 = 210; - + /** ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") */ + public static final MediaSize ISO_A0 = + new MediaSize("ISO_A0", "android", R.string.mediaSize_iso_a0, 33110, 46810); + /** ISO A1 media size: 594mm x 841mm (23.39" x 33.11") */ + public static final MediaSize ISO_A1 = + new MediaSize("ISO_A1", "android", R.string.mediaSize_iso_a1, 23390, 33110); + /** ISO A2 media size: 420mm x 594mm (16.54" x 23.39") */ + public static final MediaSize ISO_A2 = + new MediaSize("ISO_A2", "android", R.string.mediaSize_iso_a2, 16540, 23390); + /** ISO A3 media size: 297mm x 420mm (11.69" x 16.54") */ + public static final MediaSize ISO_A3 = + new MediaSize("ISO_A3", "android", R.string.mediaSize_iso_a3, 11690, 16540); + /** ISO A4 media size: 210mm x 297mm (8.27" x 11.69") */ + public static final MediaSize ISO_A4 = + new MediaSize("ISO_A4", "android", R.string.mediaSize_iso_a4, 8270, 11690); + /** ISO A5 media size: 148mm x 210mm (5.83" x 8.27") */ + public static final MediaSize ISO_A5 = + new MediaSize("ISO_A5", "android", R.string.mediaSize_iso_a5, 5830, 8270); + /** ISO A6 media size: 105mm x 148mm (4.13" x 5.83") */ + public static final MediaSize ISO_A6 = + new MediaSize("ISO_A6", "android", R.string.mediaSize_iso_a6, 4130, 5830); + /** ISO A7 media size: 74mm x 105mm (2.91" x 4.13") */ + public static final MediaSize ISO_A7 = + new MediaSize("ISO_A7", "android", R.string.mediaSize_iso_a7, 2910, 4130); + /** ISO A8 media size: 52mm x 74mm (2.05" x 2.91") */ + public static final MediaSize ISO_A8 = + new MediaSize("ISO_A8", "android", R.string.mediaSize_iso_a8, 2050, 2910); + /** ISO A9 media size: 37mm x 52mm (1.46" x 2.05") */ + public static final MediaSize ISO_A9 = + new MediaSize("ISO_A9", "android", R.string.mediaSize_iso_a9, 1460, 2050); + /** ISO A10 media size: 26mm x 37mm (1.02" x 1.46") */ + public static final MediaSize ISO_A10 = + new MediaSize("ISO_A10", "android", R.string.mediaSize_iso_a10, 1020, 1460); + + /** ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") */ + public static final MediaSize ISO_B0 = + new MediaSize("ISO_B0", "android", R.string.mediaSize_iso_b0, 39370, 55670); + /** ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") */ + public static final MediaSize ISO_B1 = + new MediaSize("ISO_B1", "android", R.string.mediaSize_iso_b1, 27830, 39370); + /** ISO B2 media size: 500mm x 707mm (19.69" x 27.83") */ + public static final MediaSize ISO_B2 = + new MediaSize("ISO_B2", "android", R.string.mediaSize_iso_b2, 19690, 27830); + /** ISO B3 media size: 353mm x 500mm (13.90" x 19.69") */ + public static final MediaSize ISO_B3 = + new MediaSize("ISO_B3", "android", R.string.mediaSize_iso_b3, 13900, 19690); + /** ISO B4 media size: 250mm x 353mm (9.84" x 13.90") */ + public static final MediaSize ISO_B4 = + new MediaSize("ISO_B4", "android", R.string.mediaSize_iso_b4, 9840, 13900); + /** ISO B5 media size: 176mm x 250mm (6.93" x 9.84") */ + public static final MediaSize ISO_B5 = + new MediaSize("ISO_B5", "android", R.string.mediaSize_iso_b5, 6930, 9840); + /** ISO B6 media size: 125mm x 176mm (4.92" x 6.93") */ + public static final MediaSize ISO_B6 = + new MediaSize("ISO_B6", "android", R.string.mediaSize_iso_b6, 4920, 6930); + /** ISO B7 media size: 88mm x 125mm (3.46" x 4.92") */ + public static final MediaSize ISO_B7 = + new MediaSize("ISO_B7", "android", R.string.mediaSize_iso_b7, 3460, 4920); + /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") */ + public static final MediaSize ISO_B8 = + new MediaSize("ISO_B8", "android", R.string.mediaSize_iso_b8, 2440, 3460); + /** ISO B9 media size: 44mm x 62mm (1.73" x 2.44") */ + public static final MediaSize ISO_B9 = + new MediaSize("ISO_B9", "android", R.string.mediaSize_iso_b9, 1730, 2440); + /** ISO B10 media size: 31mm x 44mm (1.22" x 1.73") */ + public static final MediaSize ISO_B10 = + new MediaSize("ISO_B10", "android", R.string.mediaSize_iso_b10, 1220, 1730); + + /** ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") */ + public static final MediaSize ISO_C0 = + new MediaSize("ISO_C0", "android", R.string.mediaSize_iso_c0, 36100, 51060); + /** ISO C1 media size: 648mm x 917mm (25.51" x 36.10") */ + public static final MediaSize ISO_C1 = + new MediaSize("ISO_C1", "android", R.string.mediaSize_iso_c1, 25510, 36100); + /** ISO C2 media size: 458mm x 648mm (18.03" x 25.51") */ + public static final MediaSize ISO_C2 = + new MediaSize("ISO_C2", "android", R.string.mediaSize_iso_c2, 18030, 25510); + /** ISO C3 media size: 324mm x 458mm (12.76" x 18.03") */ + public static final MediaSize ISO_C3 = + new MediaSize("ISO_C3", "android", R.string.mediaSize_iso_c3, 12760, 18030); + /** ISO C4 media size: 229mm x 324mm (9.02" x 12.76") */ + public static final MediaSize ISO_C4 = + new MediaSize("ISO_C4", "android", R.string.mediaSize_iso_c4, 9020, 12760); + /** ISO C5 media size: 162mm x 229mm (6.38" x 9.02") */ + public static final MediaSize ISO_C5 = + new MediaSize("ISO_C5", "android", R.string.mediaSize_iso_c5, 6380, 9020); + /** ISO C6 media size: 114mm x 162mm (4.49" x 6.38") */ + public static final MediaSize ISO_C6 = + new MediaSize("ISO_C6", "android", R.string.mediaSize_iso_c6, 4490, 6380); + /** ISO C7 media size: 81mm x 114mm (3.19" x 4.49") */ + public static final MediaSize ISO_C7 = + new MediaSize("ISO_C7", "android", R.string.mediaSize_iso_c7, 3190, 4490); + /** ISO C8 media size: 57mm x 81mm (2.24" x 3.19") */ + public static final MediaSize ISO_C8 = + new MediaSize("ISO_C8", "android", R.string.mediaSize_iso_c8, 2240, 3190); + /** ISO C9 media size: 40mm x 57mm (1.57" x 2.24") */ + public static final MediaSize ISO_C9 = + new MediaSize("ISO_C9", "android", R.string.mediaSize_iso_c9, 1570, 2240); + /** ISO C10 media size: 28mm x 40mm (1.10" x 1.57") */ + public static final MediaSize ISO_C10 = + new MediaSize("ISO_C10", "android", R.string.mediaSize_iso_c10, 1100, 1570); // North America - /** - * North America Letter media size: 8.5" x 11" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LETTER = 300; - - /** - * North America Government-Letter media size: 8.0" x 10.5" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_GOVT_LETTER = 301; - - /** - * North America Legal media size: 8.5" x 14" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LEGAL = 302; + /** North America Letter media size: 8.5" x 11" */ + public static final MediaSize NA_LETTER = + new MediaSize("NA_LETTER", "android", R.string.mediaSize_na_letter, 8500, 11000); + /** North America Government-Letter media size: 8.0" x 10.5" */ + public static final MediaSize NA_GOVT_LETTER = + new MediaSize("NA_GOVT_LETTER", "android", + R.string.mediaSize_na_gvrnmt_letter, 8000, 10500); + /** North America Legal media size: 8.5" x 14" */ + public static final MediaSize NA_LEGAL = + new MediaSize("NA_LEGAL", "android", R.string.mediaSize_na_legal, 8500, 14000); + /** North America Junior Legal media size: 8.0" x 5.0" */ + public static final MediaSize NA_JUNIOR_LEGAL = + new MediaSize("NA_JUNIOR_LEGAL", "android", + R.string.mediaSize_na_junior_legal, 8000, 5000); + /** North America Ledger media size: 17" x 11" */ + public static final MediaSize NA_LEDGER = + new MediaSize("NA_LEDGER", "android", R.string.mediaSize_na_ledger, 17000, 11000); + /** North America Tabloid media size: 11" x 17" */ + public static final MediaSize NA_TBLOID = + new MediaSize("NA_TABLOID", "android", + R.string.mediaSize_na_tabloid, 11000, 17000); - /** - * North America Junior Legal media size: 8.0" x 5.0" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_JUNIOR_LEGAL = 303; - - /** - * North America Ledger media size: 17" x 11" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LEDGER = 304; + private final String mId; + /**@hide */ + public final String mLabel; + /**@hide */ + public final String mPackageName; + /**@hide */ + public final int mLabelResId; + private final int mWidthMils; + private final int mHeightMils; /** - * North America Tabloid media size: 11" x 17" + * Creates a new instance. This is the preferred constructor since + * it enables the media size label to be shown in a localized fashion + * on a locale change. * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_TBLOID = 305; - - /** - * Creates a standard media size with a localized label. + * @param id The unique media size id. + * @param packageName The name of the creating package. + * @param labelResId The resource if of a human readable label. + * @param widthMils The width in mils (thousands of an inch). + * @param heightMils The height in mils (thousands of an inch). * - * @param pm Package manager used to load the label. - * @param mediaSize Media size constant. - * @return A {@link MediaSize} instance with a localized label. + * @throws IllegalArgumentException If the id is empty. + * @throws IllegalArgumentException If the label is empty. + * @throws IllegalArgumentException If the widthMils is less than or equal to zero. + * @throws IllegalArgumentException If the heightMils is less than or equal to zero. */ - public static MediaSize createMediaSize(PackageManager pm, int mediaSize) { - final Resources resources; - try { - resources = pm.getResourcesForApplication("android"); - } catch (NameNotFoundException nnfe) { - return null; + public MediaSize(String id, String packageName, int labelResId, + int widthMils, int heightMils) { + if (TextUtils.isEmpty(id)) { + throw new IllegalArgumentException("id cannot be empty."); } - switch (mediaSize) { - case ISO_A0: { - return new MediaSize("ISO_A0", resources - .getString(R.string.mediaSize_iso_a0), 33110, 46810); - } - case ISO_A1: { - return new MediaSize("ISO_A1", resources - .getString(R.string.mediaSize_iso_a1), 23390, 33110); - } - case ISO_A2: { - return new MediaSize("ISO_A2", resources - .getString(R.string.mediaSize_iso_a2), 16540, 23390); - } - case ISO_A3: { - return new MediaSize("ISO_A3", resources - .getString(R.string.mediaSize_iso_a3), 11690, 16540); - } - case ISO_A4: { - return new MediaSize("ISO_A4", resources - .getString(R.string.mediaSize_iso_a4), 8270, 11690); - } - case ISO_A5: { - return new MediaSize("ISO_A5", resources - .getString(R.string.mediaSize_iso_a5), 5830, 8270); - } - case ISO_A6: { - return new MediaSize("ISO_A6", resources - .getString(R.string.mediaSize_iso_a6), 4130, 5830); - } - case ISO_A7: { - return new MediaSize("ISO_A7", resources - .getString(R.string.mediaSize_iso_a7), 2910, 4130); - } - case ISO_A8: { - return new MediaSize("ISO_A8", resources - .getString(R.string.mediaSize_iso_a8), 2050, 2910); - } - case ISO_A9: { - return new MediaSize("ISO_A9", resources - .getString(R.string.mediaSize_iso_a9), 1460, 2050); - } - case ISO_A10: { - return new MediaSize("ISO_A10", resources - .getString(R.string.mediaSize_iso_a10), 1020, 1460); - } - case ISO_B0: { - return new MediaSize("ISO_B0", resources - .getString(R.string.mediaSize_iso_b0), 39370, 55670); - } - case ISO_B1: { - return new MediaSize("ISO_B1", resources - .getString(R.string.mediaSize_iso_b1), 27830, 39370); - } - case ISO_B2: { - return new MediaSize("ISO_B2", resources - .getString(R.string.mediaSize_iso_b2), 19690, 27830); - } - case ISO_B3: { - return new MediaSize("ISO_B3", resources - .getString(R.string.mediaSize_iso_b3), 13900, 19690); - } - case ISO_B4: { - return new MediaSize("ISO_B4", resources - .getString(R.string.mediaSize_iso_b4), 9840, 13900); - } - case ISO_B5: { - return new MediaSize("ISO_B5", resources - .getString(R.string.mediaSize_iso_b5), 6930, 9840); - } - case ISO_B6: { - return new MediaSize("ISO_B6", resources - .getString(R.string.mediaSize_iso_b6), 4920, 6930); - } - case ISO_B7: { - return new MediaSize("ISO_B7", resources - .getString(R.string.mediaSize_iso_b7), 3460, 4920); - } - case ISO_B8: { - return new MediaSize("ISO_B8", resources - .getString(R.string.mediaSize_iso_b8), 2440, 3460); - } - case ISO_B9: { - return new MediaSize("ISO_B9", resources - .getString(R.string.mediaSize_iso_b9), 1730, 2440); - } - case ISO_B10: { - return new MediaSize("ISO_B10", resources - .getString(R.string.mediaSize_iso_b10), 1220, 1730); - } - case ISO_C0: { - return new MediaSize("ISO_C0", resources - .getString(R.string.mediaSize_iso_c0), 36100, 51060); - } - case ISO_C1: { - return new MediaSize("ISO_C1", resources - .getString(R.string.mediaSize_iso_c1), 25510, 36100); - } - case ISO_C2: { - return new MediaSize("ISO_C2", resources - .getString(R.string.mediaSize_iso_c2), 18030, 25510); - } - case ISO_C3: { - return new MediaSize("ISO_C3", resources - .getString(R.string.mediaSize_iso_c3), 12760, 18030); - } - case ISO_C4: { - return new MediaSize("ISO_C4", resources - .getString(R.string.mediaSize_iso_c4), 9020, 12760); - } - case ISO_C5: { - return new MediaSize("ISO_C5", resources - .getString(R.string.mediaSize_iso_c5), 6380, 9020); - } - case ISO_C6: { - return new MediaSize("ISO_C6", resources - .getString(R.string.mediaSize_iso_c6), 4490, 6380); - } - case ISO_C7: { - return new MediaSize("ISO_C7", resources - .getString(R.string.mediaSize_iso_c7), 3190, 4490); - } - case ISO_C8: { - return new MediaSize("ISO_C8", resources - .getString(R.string.mediaSize_iso_c8), 2240, 3190); - } - case ISO_C9: { - return new MediaSize("ISO_C9", resources - .getString(R.string.mediaSize_iso_c9), 1570, 2240); - } - case ISO_C10: { - return new MediaSize("ISO_C10", resources - .getString(R.string.mediaSize_iso_c10), 1100, 1570); - } - case NA_LETTER: { - return new MediaSize("NA_LETTER", resources - .getString(R.string.mediaSize_na_letter), 8500, 11000); - } - case NA_GOVT_LETTER: { - return new MediaSize("NA_GOVT_LETTER", resources - .getString(R.string.mediaSize_na_gvrnmt_letter), 8000, 10500); - } - case NA_LEGAL: { - return new MediaSize("NA_LEGAL", resources - .getString(R.string.mediaSize_na_legal), 8500, 14000); - } - case NA_JUNIOR_LEGAL: { - return new MediaSize("NA_JUNIOR_LEGAL", resources - .getString(R.string.mediaSize_na_junior_legal), 8000, 5000); - } - case NA_LEDGER: { - return new MediaSize("NA_LEDGER", resources - .getString(R.string.mediaSize_na_ledger), 17000, 11000); - } - case NA_TBLOID: { - return new MediaSize("NA_TABLOID", resources - .getString(R.string.mediaSize_na_tabloid), 11000, 17000); - } - default: { - throw new IllegalArgumentException("Unknown media size."); - } + if (TextUtils.isEmpty(packageName)) { + throw new IllegalArgumentException("packageName cannot be empty."); + } + if (labelResId <= 0) { + throw new IllegalArgumentException("labelResId must be greater than zero."); } + if (widthMils <= 0) { + throw new IllegalArgumentException("widthMils " + + "cannot be less than or equal to zero."); + } + if (heightMils <= 0) { + throw new IllegalArgumentException("heightMils " + + "cannot be less than or euqual to zero."); + } + mPackageName = packageName; + mId = id; + mLabelResId = labelResId; + mWidthMils = widthMils; + mHeightMils = heightMils; + mLabel = null; } - private final String mId; - private final String mLabel; - private final int mWidthMils; - private final int mHeightMils; - /** - * Creates a new instance. + * Creates a new instance. You should use this constructor as a fallback + * in cases when you do not have a localized string for the label. * * @param id The unique media size id. * @param label The <strong>internationalized</strong> human readable label. @@ -975,6 +473,19 @@ public final class PrintAttributes implements Parcelable { mLabel = label; mWidthMils = widthMils; mHeightMils = heightMils; + mLabelResId = 0; + mPackageName = null; + } + + /** @hide */ + public MediaSize(String id, String label, String packageName, + int widthMils, int heightMils, int labelResId) { + mPackageName = packageName; + mId = id; + mLabelResId = labelResId; + mWidthMils = widthMils; + mHeightMils = heightMils; + mLabel = label; } /** @@ -989,9 +500,22 @@ public final class PrintAttributes implements Parcelable { /** * Gets the human readable media size label. * + * @param packageManager The package manager for loading the label. * @return The human readable label. */ - public String getLabel() { + public String getLabel(PackageManager packageManager) { + if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) { + try { + return packageManager.getResourcesForApplication( + mPackageName).getString(mLabelResId); + } catch (NotFoundException nfe) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } catch (NameNotFoundException nnfee) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } + } return mLabel; } @@ -1013,17 +537,62 @@ public final class PrintAttributes implements Parcelable { return mHeightMils; } + /** + * Gets whether this media size is in portrait which is the + * height is greater or equal to the width. + * + * @return True if the media size is in portrait, false if + * it is in landscape. + */ + public boolean isPortrait() { + return mHeightMils >= mWidthMils; + } + + /** + * Returns a new media size in a portrait orientation + * which is the height is the lesser dimension. + * + * @return New instance in landscape orientation. + */ + public MediaSize asPortrait() { + if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) { + return new MediaSize(mId, mPackageName, mLabelResId, + Math.min(mWidthMils, mHeightMils), + Math.max(mWidthMils, mHeightMils)); + } else { + return new MediaSize(mId, mLabel, + Math.min(mWidthMils, mHeightMils), + Math.max(mWidthMils, mHeightMils)); + } + } + + /** + * Returns a new media size in a landscape orientation + * which is the height is the greater dimension. + * + * @return New instance in landscape orientation. + */ + public MediaSize asLandscape() { + return new MediaSize(mId, mLabel, + Math.max(mWidthMils, mHeightMils), + Math.min(mWidthMils, mHeightMils)); + } + void writeToParcel(Parcel parcel) { parcel.writeString(mId); parcel.writeString(mLabel); + parcel.writeString(mPackageName); parcel.writeInt(mWidthMils); parcel.writeInt(mHeightMils); + parcel.writeInt(mLabelResId); } static MediaSize createFromParcel(Parcel parcel) { return new MediaSize( parcel.readString(), parcel.readString(), + parcel.readString(), + parcel.readInt(), parcel.readInt(), parcel.readInt()); } @@ -1033,7 +602,6 @@ public final class PrintAttributes implements Parcelable { final int prime = 31; int result = 1; result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); result = prime * result + mWidthMils; result = prime * result + mHeightMils; return result; @@ -1054,9 +622,6 @@ public final class PrintAttributes implements Parcelable { if (!TextUtils.equals(mId, other.mId)) { return false; } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } if (mWidthMils != other.mWidthMils) { return false; } @@ -1072,8 +637,10 @@ public final class PrintAttributes implements Parcelable { builder.append("MediaSize{"); builder.append("id: ").append(mId); builder.append(", label: ").append(mLabel); + builder.append(", packageName: ").append(mPackageName); builder.append(", heightMils: ").append(mHeightMils); builder.append(", widthMils: ").append(mWidthMils); + builder.append(", labelResId: ").append(mLabelResId); builder.append("}"); return builder.toString(); } @@ -1083,13 +650,64 @@ public final class PrintAttributes implements Parcelable { * This class specifies a supported resolution in dpi (dots per inch). */ public static final class Resolution { + private static final String LOG_TAG = "Resolution"; + private final String mId; - private final String mLabel; + /**@hide */ + public final String mLabel; + /**@hide */ + public final String mPackageName; + /**@hide */ + public final int mLabelResId; private final int mHorizontalDpi; private final int mVerticalDpi; /** - * Creates a new instance. + * Creates a new instance. This is the preferred constructor since + * it enables the resolution label to be shown in a localized fashion + * on a locale change. + * + * @param id The unique resolution id. + * @param packageName The name of the creating package. + * @param labelResId The resource id of a human readable label. + * @param horizontalDpi The horizontal resolution in dpi. + * @param verticalDpi The vertical resolution in dpi. + * + * @throws IllegalArgumentException If the id is empty. + * @throws IllegalArgumentException If the label is empty. + * @throws IllegalArgumentException If the horizontalDpi is less than or equal to zero. + * @throws IllegalArgumentException If the verticalDpi is less than or equal to zero. + */ + public Resolution(String id, String packageName, int labelResId, + int horizontalDpi, int verticalDpi) { + if (TextUtils.isEmpty(id)) { + throw new IllegalArgumentException("id cannot be empty."); + } + if (TextUtils.isEmpty(packageName)) { + throw new IllegalArgumentException("packageName cannot be empty."); + } + if (labelResId <= 0) { + throw new IllegalArgumentException("labelResId must be greater than zero."); + } + if (horizontalDpi <= 0) { + throw new IllegalArgumentException("horizontalDpi " + + "cannot be less than or equal to zero."); + } + if (verticalDpi <= 0) { + throw new IllegalArgumentException("verticalDpi" + + " cannot be less than or equal to zero."); + } + mId = id; + mPackageName = packageName; + mLabelResId = labelResId; + mHorizontalDpi = horizontalDpi; + mVerticalDpi = verticalDpi; + mLabel = null; + } + + /** + * Creates a new instance. You should use this constructor as a fallback + * in cases when you do not have a localized string for the label. * * @param id The unique resolution id. * @param label The <strong>internationalized</strong> human readable label. @@ -1120,6 +738,19 @@ public final class PrintAttributes implements Parcelable { mLabel = label; mHorizontalDpi = horizontalDpi; mVerticalDpi = verticalDpi; + mPackageName = null; + mLabelResId = 0; + } + + /** @hide */ + public Resolution(String id, String label, String packageName, + int horizontalDpi, int verticalDpi, int labelResId) { + mId = id; + mPackageName = packageName; + mLabelResId = labelResId; + mHorizontalDpi = horizontalDpi; + mVerticalDpi = verticalDpi; + mLabel = label; } /** @@ -1134,14 +765,27 @@ public final class PrintAttributes implements Parcelable { /** * Gets the resolution human readable label. * + * @param packageManager The package manager for loading the label. * @return The human readable label. */ - public String getLabel() { + public String getLabel(PackageManager packageManager) { + if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) { + try { + return packageManager.getResourcesForApplication( + mPackageName).getString(mLabelResId); + } catch (NotFoundException nfe) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } catch (NameNotFoundException nnfee) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } + } return mLabel; } /** - * Gets the horizontal resolution in dpi. + * Gets the vertical resolution in dpi. * * @return The horizontal resolution. */ @@ -1161,14 +805,18 @@ public final class PrintAttributes implements Parcelable { void writeToParcel(Parcel parcel) { parcel.writeString(mId); parcel.writeString(mLabel); + parcel.writeString(mPackageName); parcel.writeInt(mHorizontalDpi); parcel.writeInt(mVerticalDpi); + parcel.writeInt(mLabelResId); } static Resolution createFromParcel(Parcel parcel) { return new Resolution( parcel.readString(), parcel.readString(), + parcel.readString(), + parcel.readInt(), parcel.readInt(), parcel.readInt()); } @@ -1178,7 +826,6 @@ public final class PrintAttributes implements Parcelable { final int prime = 31; int result = 1; result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); result = prime * result + mHorizontalDpi; result = prime * result + mVerticalDpi; return result; @@ -1199,9 +846,6 @@ public final class PrintAttributes implements Parcelable { if (!TextUtils.equals(mId, other.mId)) { return false; } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } if (mHorizontalDpi != other.mHorizontalDpi) { return false; } @@ -1217,8 +861,10 @@ public final class PrintAttributes implements Parcelable { builder.append("Resolution{"); builder.append("id: ").append(mId); builder.append(", label: ").append(mLabel); + builder.append(", packageName: ").append(mPackageName); builder.append(", horizontalDpi: ").append(mHorizontalDpi); builder.append(", verticalDpi: ").append(mVerticalDpi); + builder.append(", labelResId: ").append(mLabelResId); builder.append("}"); return builder.toString(); } @@ -1358,120 +1004,6 @@ public final class PrintAttributes implements Parcelable { } } - /** - * Represents a printer tray. - */ - public static final class Tray { - private final String mId; - private final String mLabel; - - /** - * Creates a new instance. - * - * @param id The unique tray id. - * @param label The <strong>internationalized</strong> human readable label. - * - * @throws IllegalArgumentException If the id is empty. - * @throws IllegalArgumentException If the label is empty. - */ - public Tray(String id, String label) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("id cannot be empty."); - } - if (TextUtils.isEmpty(label)) { - throw new IllegalArgumentException("label cannot be empty."); - } - mId = id; - mLabel = label; - } - - /** - * Gets the unique tray id. - * - * @return The unique tray id. - */ - public String getId() { - return mId; - } - - /** - * Gets the tray human readable label. - * - * @return The human readable label. - */ - public String getLabel() { - return mLabel; - } - - void writeToParcel(Parcel parcel) { - parcel.writeString(mId); - parcel.writeString(mLabel); - } - - static Tray createFromParcel(Parcel parcel) { - return new Tray( - parcel.readString(), - parcel.readString()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Tray other = (Tray) obj; - if (!TextUtils.equals(mId, other.mId)) { - return false; - } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } - return true; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Tray{"); - builder.append("id: ").append(mId); - builder.append("id: ").append(mId); - builder.append(", label: ").append(mLabel); - builder.append("}"); - return builder.toString(); - } - } - - static String duplexModeToString(int duplexMode) { - switch (duplexMode) { - case DUPLEX_MODE_NONE: { - return "DUPLEX_MODE_NONE"; - } - case DUPLEX_MODE_LONG_EDGE: { - return "DUPLEX_MODE_LONG_EDGE"; - } - case DUPLEX_MODE_SHORT_EDGE: { - return "DUPLEX_MODE_SHORT_EDGE"; - } - default: - return "DUPLEX_MODE_UNKNOWN"; - } - } - static String colorModeToString(int colorMode) { switch (colorMode) { case COLOR_MODE_MONOCHROME: { @@ -1485,59 +1017,12 @@ public final class PrintAttributes implements Parcelable { } } - static String orientationToString(int orientation) { - switch (orientation) { - case ORIENTATION_PORTRAIT: { - return "ORIENTATION_PORTRAIT"; - } - case ORIENTATION_LANDSCAPE: { - return "ORIENTATION_LANDSCAPE"; - } - default: - return "ORIENTATION_UNKNOWN"; - } - } - - static String fittingModeToString(int fittingMode) { - switch (fittingMode) { - case FITTING_MODE_NONE: { - return "FITTING_MODE_NONE"; - } - case FITTING_MODE_SCALE_TO_FIT: { - return "FITTING_MODE_SCALE_TO_FIT"; - } - case FITTING_MODE_SCALE_TO_FILL: { - return "FITTING_MODE_SCALE_TO_FILL"; - } - default: - return "FITTING_MODE_UNKNOWN"; - } - } - - static void enforceValidDuplexMode(int duplexMode) { - if ((duplexMode & VALID_DUPLEX_MODES) == 0 && Integer.bitCount(duplexMode) == 1) { - throw new IllegalArgumentException("invalid duplex mode: " + duplexMode); - } - } - static void enforceValidColorMode(int colorMode) { if ((colorMode & VALID_COLOR_MODES) == 0 && Integer.bitCount(colorMode) == 1) { throw new IllegalArgumentException("invalid color mode: " + colorMode); } } - static void enforceValidFittingMode(int fittingMode) { - if ((fittingMode & VALID_FITTING_MODES) == 0 && Integer.bitCount(fittingMode) == 1) { - throw new IllegalArgumentException("invalid fitting mode: " + fittingMode); - } - } - - static void enforceValidOrientation(int orientation) { - if ((orientation & VALID_ORIENTATIONS) == 0 && Integer.bitCount(orientation) == 1) { - throw new IllegalArgumentException("invalid orientation: " + orientation); - } - } - /** * Builder for creating {@link PrintAttributes}. */ @@ -1578,46 +1063,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the input tray. - * - * @param inputTray The tray. - * @return This builder. - */ - public Builder setInputTray(Tray inputTray) { - mAttributes.setInputTray(inputTray); - return this; - } - - /** - * Sets the output tray. - * - * @param outputTray The tray. - * @return This builder. - */ - public Builder setOutputTray(Tray outputTray) { - mAttributes.setOutputTray(outputTray); - return this; - } - - /** - * Sets the duplex mode. - * - * @param duplexMode A valid duplex mode or zero. - * @return This builder. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - */ - public Builder setDuplexMode(int duplexMode) { - if (Integer.bitCount(duplexMode) > 1) { - throw new IllegalArgumentException("can specify at most one duplexMode bit."); - } - mAttributes.setDuplexMode(duplexMode); - return this; - } - - /** * Sets the color mode. * * @param colorMode A valid color mode or zero. @@ -1635,40 +1080,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the fitting mode. - * - * @param fittingMode A valid fitting mode or zero. - * @return This builder. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public Builder setFittingMode(int fittingMode) { - if (Integer.bitCount(fittingMode) > 1) { - throw new IllegalArgumentException("can specify at most one fittingMode bit."); - } - mAttributes.setFittingMode(fittingMode); - return this; - } - - /** - * Sets the orientation. - * - * @param orientation A valid orientation or zero. - * @return This builder. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public Builder setOrientation(int orientation) { - if (Integer.bitCount(orientation) > 1) { - throw new IllegalArgumentException("can specify at most one orientation bit."); - } - mAttributes.setOrientation(orientation); - return this; - } - - /** * Creates a new {@link PrintAttributes} instance. * * @return The new instance. diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java index 33b4aad..bb26a3a 100644 --- a/core/java/android/print/PrintDocumentAdapter.java +++ b/core/java/android/print/PrintDocumentAdapter.java @@ -101,28 +101,6 @@ public abstract class PrintDocumentAdapter { * LayoutResultCallback#onLayoutFailed(CharSequence)}, if an error occurred. * </p> * <p> - * When doing a layout you may satisfy some of the constraints in the print - * attributes such as applying the appropriate fitting, emitting content in the - * requested orientation, using the specified margins, generating content with - * the desired color mode, producing output with the given media size. Ideally, - * you will satisfy all of these constraints. It is important that if you - * satisfy a given constraint, you update the {@link PrintDocumentInfo} that - * is returned in the given {@link LayoutResultCallback}. This way the printer - * will have more accurate information about the content, thus producing a - * better output. For example, assume that your application is printing - * an image and the print attributes request landscape and fitting mode scale - * to fill. The result of this operation should be the entire media is filled - * and the content is rotated ninety degrees. In this case it is beneficial - * you do the rotation and select a higher resolution image to utilize - * the wider media (the height is now the width), rather to use a lower - * resolution image that is later stretched by the printer. If you applied - * the rotation you have to update the returned print document info to - * reflect that the content is already in landscape by calling - * {@link PrintDocumentInfo.Builder#setOrientation(int)} with {@link - * PrintAttributes#ORIENTATION_LANDSCAPE}. In this case the printer does not - * have to rotate the content. - * </p> - * <p> * <strong>Note:</strong> If the content is large and a layout will be * performed, it is a good practice to schedule the work on a dedicated * thread and register an observer in the provided {@link diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java index f2b91ae..7a96e69 100644 --- a/core/java/android/print/PrintDocumentInfo.java +++ b/core/java/android/print/PrintDocumentInfo.java @@ -18,8 +18,6 @@ package android.print; import android.os.Parcel; import android.os.Parcelable; -import android.print.PrintAttributes.Margins; -import android.print.PrintAttributes.MediaSize; import android.text.TextUtils; /** @@ -28,11 +26,6 @@ import android.text.TextUtils; public final class PrintDocumentInfo implements Parcelable { /** - * Constant for an unknown media size. - */ - public static final MediaSize MEDIA_SIZE_UNKNOWN = new MediaSize("Unknown", "Unknown", 1, 1); - - /** * Constant for unknown page count.. */ public static final int PAGE_COUNT_UNKNOWN = -1; @@ -55,11 +48,6 @@ public final class PrintDocumentInfo implements Parcelable { private String mName; private int mPageCount; private int mContentType; - private int mOrientation; - private int mFittingMode; - private int mColorMode; - private Margins mMargins; - private MediaSize mMediaSize; private long mDataSize; /** @@ -78,11 +66,6 @@ public final class PrintDocumentInfo implements Parcelable { mName = prototype.mName; mPageCount = prototype.mPageCount; mContentType = prototype.mContentType; - mOrientation = prototype.mOrientation; - mFittingMode = prototype.mFittingMode; - mColorMode = prototype.mColorMode; - mMargins = prototype.mMargins; - mMediaSize = prototype.mMediaSize; mDataSize = prototype.mDataSize; } @@ -95,11 +78,6 @@ public final class PrintDocumentInfo implements Parcelable { mName = parcel.readString(); mPageCount = parcel.readInt(); mContentType = parcel.readInt(); - mOrientation = parcel.readInt(); - mFittingMode = parcel.readInt(); - mColorMode = parcel.readInt(); - mMargins = Margins.createFromParcel(parcel); - mMediaSize = MediaSize.createFromParcel(parcel); mDataSize = parcel.readLong(); } @@ -137,61 +115,6 @@ public final class PrintDocumentInfo implements Parcelable { } /** - * Gets the document orientation. - * - * @return The orientation. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE - */ - public int getOrientation() { - return mOrientation; - } - - /** - * Gets the document fitting mode. - * - * @return The fitting mode. - * - * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT - */ - public int getFittingMode() { - return mFittingMode; - } - - /** - * Gets document color mode. - * - * @return The color mode. - * - * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR - * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME - */ - public int getColorMode() { - return mColorMode; - } - - /** - * Gets the document margins. - * - * @return The margins. - */ - public Margins getMargins() { - return mMargins; - } - - /** - * Gets the media size. - * - * @return The media size. - */ - public MediaSize getMediaSize() { - return mMediaSize; - } - - /** * Gets the document data size in bytes. * * @return The data size. @@ -221,11 +144,6 @@ public final class PrintDocumentInfo implements Parcelable { parcel.writeString(mName); parcel.writeInt(mPageCount); parcel.writeInt(mContentType); - parcel.writeInt(mOrientation); - parcel.writeInt(mFittingMode); - parcel.writeInt(mColorMode); - mMargins.writeToParcel(parcel); - mMediaSize.writeToParcel(parcel); parcel.writeLong(mDataSize); } @@ -236,11 +154,6 @@ public final class PrintDocumentInfo implements Parcelable { result = prime * result + ((mName != null) ? mName.hashCode() : 0); result = prime * result + mContentType; result = prime * result + mPageCount; - result = prime * result + mOrientation; - result = prime * result + mFittingMode; - result = prime * result + mColorMode; - result = prime * result + (mMargins != null ? mMargins.hashCode() : 0); - result = prime * result + (mMediaSize != null ? mMediaSize.hashCode() : 0); result = prime * result + (int) mDataSize; result = prime * result + (int) mDataSize >> 32; return result; @@ -267,29 +180,6 @@ public final class PrintDocumentInfo implements Parcelable { if (mPageCount != other.mPageCount) { return false; } - if (mOrientation != other.mOrientation) { - return false; - } - if (mFittingMode != other.mFittingMode) { - return false; - } - if (mColorMode != other.mColorMode) { - return false; - } - if (mMargins == null) { - if (other.mMargins != null) { - return false; - } - } else if (!mMargins.equals(other.mMargins)) { - return false; - } - if (mMediaSize == null) { - if (other.mMediaSize != null) { - return false; - } - } else if (!mMediaSize.equals(other.mMediaSize)) { - return false; - } if (mDataSize != other.mDataSize) { return false; } @@ -303,11 +193,6 @@ public final class PrintDocumentInfo implements Parcelable { builder.append("name=").append(mName); builder.append(", pageCount=").append(mPageCount); builder.append(", contentType=").append(contentTyepToString(mContentType)); - builder.append(", orientation=").append(PrintAttributes.orientationToString(mOrientation)); - builder.append(", fittingMode=").append(PrintAttributes.fittingModeToString(mFittingMode)); - builder.append(", colorMode=").append(PrintAttributes.colorModeToString(mColorMode)); - builder.append(", margins=").append(mMargins); - builder.append(", mediaSize=").append(mMediaSize); builder.append(", size=").append(mDataSize); builder.append("}"); return builder.toString(); @@ -336,36 +221,6 @@ public final class PrintDocumentInfo implements Parcelable { /** * Constructor. * <p> - * The values of the relevant properties are initialized from the - * provided print attributes. For example, the orientation is set - * to be the same as the orientation returned by calling {@link - * PrintAttributes#getOrientation() PrintAttributes.getOrientation()}. - * </p> - * - * @param name The document name. Cannot be empty. - * @param attributes Print attributes. Cannot be null. - * - * @throws IllegalArgumentException If the name is empty. - */ - public Builder(String name, PrintAttributes attributes) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name cannot be empty"); - } - if (attributes == null) { - throw new IllegalArgumentException("attributes cannot be null"); - } - mPrototype = new PrintDocumentInfo(); - mPrototype.mName = name; - mPrototype.mOrientation = attributes.getOrientation(); - mPrototype.mFittingMode = attributes.getFittingMode(); - mPrototype.mColorMode = attributes.getColorMode(); - mPrototype.mMargins = attributes.getMargins(); - mPrototype.mMediaSize = attributes.getMediaSize(); - } - - /** - * Constructor. - * <p> * The values of the relevant properties are initialized with default * values. Please refer to the documentation of the individual setters * for information about the default values. @@ -379,11 +234,6 @@ public final class PrintDocumentInfo implements Parcelable { } mPrototype = new PrintDocumentInfo(); mPrototype.mName = name; - mPrototype.mOrientation = PrintAttributes.ORIENTATION_PORTRAIT; - mPrototype.mFittingMode = PrintAttributes.FITTING_MODE_NONE; - mPrototype.mColorMode = PrintAttributes.COLOR_MODE_COLOR; - mPrototype.mMargins = Margins.NO_MARGINS; - mPrototype.mMediaSize = MEDIA_SIZE_UNKNOWN; } /** @@ -423,95 +273,6 @@ public final class PrintDocumentInfo implements Parcelable { } /** - * Sets the orientation. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#ORIENTATION_PORTRAIT - * PrintAttributes.ORIENTATION_PORTRAIT} - * </p> - * - * @param orientation The orientation. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE - */ - public Builder setOrientation(int orientation) { - PrintAttributes.enforceValidOrientation(orientation); - mPrototype.mOrientation = orientation; - return this; - } - - /** - * Sets the content fitting mode. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#FITTING_MODE_NONE - * PrintAttributes.FITTING_MODE_NONE} - * </p> - * - * @param fittingMode The fitting mode. - * - * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT - */ - public Builder setFittingMode(int fittingMode) { - PrintAttributes.enforceValidFittingMode(fittingMode); - mPrototype.mFittingMode = fittingMode; - return this; - } - - /** - * Sets the content color mode. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#COLOR_MODE_COLOR - * PrintAttributes.COLOR_MODE_COLOR} - * </p> - * - * @param colorMode The color mode. - * - * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR - * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME - */ - public Builder setColorMode(int colorMode) { - PrintAttributes.enforceValidColorMode(colorMode); - mPrototype.mColorMode = colorMode; - return this; - } - - /** - * Sets the document margins. - * <p> - * <strong>Default: </strong> {@link PrintAttributes.Margins#NO_MARGINS Margins.NO_MARGINS} - * </p> - * - * @param margins The margins. Cannot be null. - */ - public Builder setMargins(Margins margins) { - if (margins == null) { - throw new IllegalArgumentException("margins cannot be null"); - } - mPrototype.mMargins = margins; - return this; - } - - /** - * Sets the document media size. - * <p> - * <strong>Default: </strong>#MEDIA_SIZE_UNKNOWN - * </p> - * - * @param mediaSize The media size. Cannot be null. - * - * @see #MEDIA_SIZE_UNKNOWN - */ - public Builder setMediaSize(MediaSize mediaSize) { - if (mediaSize == null) { - throw new IllegalArgumentException("media size cannot be null"); - } - mPrototype.mMediaSize = mediaSize; - return this; - } - - /** * Creates a new {@link PrintDocumentInfo} instance. * * @return The new instance. diff --git a/core/java/android/print/PrinterCapabilitiesInfo.java b/core/java/android/print/PrinterCapabilitiesInfo.java index 941e6e1..ea44c87 100644 --- a/core/java/android/print/PrinterCapabilitiesInfo.java +++ b/core/java/android/print/PrinterCapabilitiesInfo.java @@ -21,7 +21,6 @@ import android.os.Parcelable; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; -import android.print.PrintAttributes.Tray; import java.util.ArrayList; import java.util.Arrays; @@ -40,26 +39,16 @@ public final class PrinterCapabilitiesInfo implements Parcelable { private static final int PROPERTY_MEDIA_SIZE = 0; private static final int PROPERTY_RESOLUTION = 1; - private static final int PROPERTY_INPUT_TRAY = 2; - private static final int PROPERTY_OUTPUT_TRAY = 3; - private static final int PROPERTY_DUPLEX_MODE = 4; - private static final int PROPERTY_COLOR_MODE = 5; - private static final int PROPERTY_FITTING_MODE = 6; - private static final int PROPERTY_ORIENTATION = 7; - private static final int PROPERTY_COUNT = 8; + private static final int PROPERTY_COLOR_MODE = 2; + private static final int PROPERTY_COUNT = 3; private static final Margins DEFAULT_MARGINS = new Margins(0, 0, 0, 0); private Margins mMinMargins = DEFAULT_MARGINS; private List<MediaSize> mMediaSizes; private List<Resolution> mResolutions; - private List<Tray> mInputTrays; - private List<Tray> mOutputTrays; - private int mDuplexModes; private int mColorModes; - private int mFittingModes; - private int mOrientations; private final int[] mDefaults = new int[PROPERTY_COUNT]; private Margins mDefaultMargins = DEFAULT_MARGINS; @@ -106,32 +95,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable { mResolutions = null; } - if (other.mInputTrays != null) { - if (mInputTrays != null) { - mInputTrays.clear(); - mInputTrays.addAll(other.mInputTrays); - } else { - mInputTrays = new ArrayList<Tray>(other.mInputTrays); - } - } else { - mInputTrays = null; - } - - if (other.mOutputTrays != null) { - if (mOutputTrays != null) { - mOutputTrays.clear(); - mOutputTrays.addAll(other.mOutputTrays); - } else { - mOutputTrays = new ArrayList<Tray>(other.mOutputTrays); - } - } else { - mOutputTrays = null; - } - - mDuplexModes = other.mDuplexModes; mColorModes = other.mColorModes; - mFittingModes = other.mFittingModes; - mOrientations = other.mOrientations; final int defaultCount = other.mDefaults.length; for (int i = 0; i < defaultCount; i++) { @@ -169,37 +133,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Gets the available input trays. - * - * @return The input trays. - */ - public List<Tray> getInputTrays() { - return mInputTrays; - } - - /** - * Gets the available output trays. - * - * @return The output trays. - */ - public List<Tray> getOutputTrays() { - return mOutputTrays; - } - - /** - * Gets the supported duplex modes. - * - * @return The duplex modes. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - */ - public int getDuplexModes() { - return mDuplexModes; - } - - /** * Gets the supported color modes. * * @return The color modes. @@ -212,30 +145,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Gets the supported fitting modes. - * - * @return The fitting modes. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public int getFittingModes() { - return mFittingModes; - } - - /** - * Gets the supported orientations. - * - * @return The orientations. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public int getOrientations() { - return mOrientations; - } - - /** * Gets the default print attributes. * * @param outAttributes The attributes to populated. @@ -255,48 +164,18 @@ public final class PrinterCapabilitiesInfo implements Parcelable { outAttributes.setResolution(mResolutions.get(resolutionIndex)); } - final int inputTrayIndex = mDefaults[PROPERTY_INPUT_TRAY]; - if (inputTrayIndex >= 0) { - outAttributes.setInputTray(mInputTrays.get(inputTrayIndex)); - } - - final int outputTrayIndex = mDefaults[PROPERTY_OUTPUT_TRAY]; - if (outputTrayIndex >= 0) { - outAttributes.setOutputTray(mOutputTrays.get(outputTrayIndex)); - } - - final int duplexMode = mDefaults[PROPERTY_DUPLEX_MODE]; - if (duplexMode > 0) { - outAttributes.setDuplexMode(duplexMode); - } - final int colorMode = mDefaults[PROPERTY_COLOR_MODE]; if (colorMode > 0) { outAttributes.setColorMode(colorMode); } - - final int fittingMode = mDefaults[PROPERTY_FITTING_MODE]; - if (fittingMode > 0) { - outAttributes.setFittingMode(fittingMode); - } - - final int orientation = mDefaults[PROPERTY_ORIENTATION]; - if (orientation > 0) { - outAttributes.setOrientation(orientation); - } } private PrinterCapabilitiesInfo(Parcel parcel) { mMinMargins = readMargins(parcel); readMediaSizes(parcel); readResolutions(parcel); - mInputTrays = readInputTrays(parcel); - mOutputTrays = readOutputTrays(parcel); mColorModes = parcel.readInt(); - mDuplexModes = parcel.readInt(); - mFittingModes = parcel.readInt(); - mOrientations = parcel.readInt(); readDefaults(parcel); mDefaultMargins = readMargins(parcel); @@ -312,13 +191,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable { writeMargins(mMinMargins, parcel); writeMediaSizes(parcel); writeResolutions(parcel); - writeInputTrays(parcel); - writeOutputTrays(parcel); parcel.writeInt(mColorModes); - parcel.writeInt(mDuplexModes); - parcel.writeInt(mFittingModes); - parcel.writeInt(mOrientations); writeDefaults(parcel); writeMargins(mDefaultMargins, parcel); @@ -331,12 +205,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable { result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode()); result = prime * result + ((mMediaSizes == null) ? 0 : mMediaSizes.hashCode()); result = prime * result + ((mResolutions == null) ? 0 : mResolutions.hashCode()); - result = prime * result + ((mInputTrays == null) ? 0 : mInputTrays.hashCode()); - result = prime * result + ((mOutputTrays == null) ? 0 : mOutputTrays.hashCode()); result = prime * result + mColorModes; - result = prime * result + mDuplexModes; - result = prime * result + mFittingModes; - result = prime * result + mOrientations; result = prime * result + Arrays.hashCode(mDefaults); result = prime * result + ((mDefaultMargins == null) ? 0 : mDefaultMargins.hashCode()); return result; @@ -375,32 +244,9 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } else if (!mResolutions.equals(other.mResolutions)) { return false; } - if (mInputTrays == null) { - if (other.mInputTrays != null) { - return false; - } - } else if (!mInputTrays.equals(other.mInputTrays)) { - return false; - } - if (mOutputTrays == null) { - if (other.mOutputTrays != null) { - return false; - } - } else if (!mOutputTrays.equals(other.mOutputTrays)) { - return false; - } - if (mDuplexModes != other.mDuplexModes) { - return false; - } if (mColorModes != other.mColorModes) { return false; } - if (mFittingModes != other.mFittingModes) { - return false; - } - if (mOrientations != other.mOrientations) { - return false; - } if (!Arrays.equals(mDefaults, other.mDefaults)) { return false; } @@ -421,32 +267,11 @@ public final class PrinterCapabilitiesInfo implements Parcelable { builder.append("minMargins=").append(mMinMargins); builder.append(", mediaSizes=").append(mMediaSizes); builder.append(", resolutions=").append(mResolutions); - builder.append(", inputTrays=").append(mInputTrays); - builder.append(", outputTrays=").append(mOutputTrays); - builder.append(", duplexModes=").append(duplexModesToString()); builder.append(", colorModes=").append(colorModesToString()); - builder.append(", fittingModes=").append(fittingModesToString()); - builder.append(", orientations=").append(orientationsToString()); builder.append("\"}"); return builder.toString(); } - private String duplexModesToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int duplexModes = mDuplexModes; - while (duplexModes != 0) { - final int duplexMode = 1 << Integer.numberOfTrailingZeros(duplexModes); - duplexModes &= ~duplexMode; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.duplexModeToString(duplexMode)); - } - builder.append(']'); - return builder.toString(); - } - private String colorModesToString() { StringBuilder builder = new StringBuilder(); builder.append('['); @@ -463,38 +288,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { return builder.toString(); } - private String fittingModesToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int fittingModes = mFittingModes; - while (fittingModes != 0) { - final int fittingMode = 1 << Integer.numberOfTrailingZeros(fittingModes); - fittingModes &= ~fittingMode; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.fittingModeToString(fittingMode)); - } - builder.append(']'); - return builder.toString(); - } - - private String orientationsToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int orientations = mOrientations; - while (orientations != 0) { - final int orientation = 1 << Integer.numberOfTrailingZeros(orientations); - orientations &= ~orientation; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.orientationToString(orientation)); - } - builder.append(']'); - return builder.toString(); - } - private void writeMediaSizes(Parcel parcel) { if (mMediaSizes == null) { parcel.writeInt(0); @@ -552,54 +345,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { return (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null; } - private void writeInputTrays(Parcel parcel) { - if (mInputTrays == null) { - parcel.writeInt(0); - return; - } - final int inputTrayCount = mInputTrays.size(); - parcel.writeInt(inputTrayCount); - for (int i = 0; i < inputTrayCount; i++) { - mInputTrays.get(i).writeToParcel(parcel); - } - } - - private List<Tray> readInputTrays(Parcel parcel) { - final int inputTrayCount = parcel.readInt(); - if (inputTrayCount <= 0) { - return null; - } - List<Tray> inputTrays = new ArrayList<Tray>(inputTrayCount); - for (int i = 0; i < inputTrayCount; i++) { - inputTrays.add(Tray.createFromParcel(parcel)); - } - return inputTrays; - } - - private void writeOutputTrays(Parcel parcel) { - if (mOutputTrays == null) { - parcel.writeInt(0); - return; - } - final int outputTrayCount = mOutputTrays.size(); - parcel.writeInt(outputTrayCount); - for (int i = 0; i < outputTrayCount; i++) { - mOutputTrays.get(i).writeToParcel(parcel); - } - } - - private List<Tray> readOutputTrays(Parcel parcel) { - final int outputTrayCount = parcel.readInt(); - if (outputTrayCount <= 0) { - return null; - } - List<Tray> outputTrays = new ArrayList<Tray>(outputTrayCount); - for (int i = 0; i < outputTrayCount; i++) { - outputTrays.add(Tray.createFromParcel(parcel)); - } - return outputTrays; - } - private void readDefaults(Parcel parcel) { final int defaultCount = parcel.readInt(); for (int i = 0; i < defaultCount; i++) { @@ -722,62 +467,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Adds an input tray. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param inputTray A tray. - * @param isDefault Whether this is the default. - * @return This builder. - * - * @throws IllegalArgumentException If set as default and there - * is already a default. - * - * @see PrintAttributes.Tray - */ - public Builder addInputTray(Tray inputTray, boolean isDefault) { - if (mPrototype.mInputTrays == null) { - mPrototype.mInputTrays = new ArrayList<Tray>(); - } - final int insertionIndex = mPrototype.mInputTrays.size(); - mPrototype.mInputTrays.add(inputTray); - if (isDefault) { - throwIfDefaultAlreadySpecified(PROPERTY_INPUT_TRAY); - mPrototype.mDefaults[PROPERTY_INPUT_TRAY] = insertionIndex; - } - return this; - } - - /** - * Adds an output tray. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param outputTray A tray. - * @param isDefault Whether this is the default. - * @return This builder. - * - * @throws IllegalArgumentException If set as default and there - * is already a default. - * - * @see PrintAttributes.Tray - */ - public Builder addOutputTray(Tray outputTray, boolean isDefault) { - if (mPrototype.mOutputTrays == null) { - mPrototype.mOutputTrays = new ArrayList<Tray>(); - } - final int insertionIndex = mPrototype.mOutputTrays.size(); - mPrototype.mOutputTrays.add(outputTray); - if (isDefault) { - throwIfDefaultAlreadySpecified(PROPERTY_OUTPUT_TRAY); - mPrototype.mDefaults[PROPERTY_OUTPUT_TRAY] = insertionIndex; - } - return this; - } - - /** * Sets the color modes. * <p> * <strong>Required:</strong> Yes @@ -810,103 +499,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Set the duplex modes. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param duplexModes The duplex mode bit mask. - * @param defaultDuplexMode The default duplex mode. - * @return This builder. - * - * @throws IllegalArgumentException If duplex modes contains an invalid - * mode bit or if the default duplex mode is invalid. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - */ - public Builder setDuplexModes(int duplexModes, int defaultDuplexMode) { - int currentModes = duplexModes; - while (currentModes > 0) { - final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes)); - currentModes &= ~currentMode; - PrintAttributes.enforceValidDuplexMode(currentMode); - } - if ((duplexModes & defaultDuplexMode) == 0) { - throw new IllegalArgumentException("Default duplex mode not in duplex modes."); - } - PrintAttributes.enforceValidDuplexMode(defaultDuplexMode); - mPrototype.mDuplexModes = duplexModes; - mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode; - return this; - } - - /** - * Sets the fitting modes. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param fittingModes The fitting mode bit mask. - * @param defaultFittingMode The default fitting mode. - * @return This builder. - * - * @throws IllegalArgumentException If fitting modes contains an invalid - * mode bit or if the default fitting mode is invalid. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public Builder setFittingModes(int fittingModes, int defaultFittingMode) { - int currentModes = fittingModes; - while (currentModes > 0) { - final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes)); - currentModes &= ~currentMode; - PrintAttributes.enforceValidFittingMode(currentMode); - } - if ((fittingModes & defaultFittingMode) == 0) { - throw new IllegalArgumentException("Default fitting mode not in fiting modes."); - } - PrintAttributes.enforceValidFittingMode(defaultFittingMode); - mPrototype.mFittingModes = fittingModes; - mPrototype.mDefaults[PROPERTY_FITTING_MODE] = defaultFittingMode; - return this; - } - - /** - * Sets the orientations. - * <p> - * <strong>Required:</strong> Yes - * </p> - * - * @param orientations The orientation bit mask. - * @param defaultOrientation The default orientation. - * @return This builder. - * - * @throws IllegalArgumentException If orientations contains an invalid - * mode bit or if the default orientation is invalid. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public Builder setOrientations(int orientations, int defaultOrientation) { - int currentOrientaions = orientations; - while (currentOrientaions > 0) { - final int currentOrnt = (1 << Integer.numberOfTrailingZeros(currentOrientaions)); - currentOrientaions &= ~currentOrnt; - PrintAttributes.enforceValidOrientation(currentOrnt); - } - if ((orientations & defaultOrientation) == 0) { - throw new IllegalArgumentException("Default orientation not in orientations."); - } - PrintAttributes.enforceValidOrientation(defaultOrientation); - mPrototype.mOrientations = orientations; - mPrototype.mDefaults[PROPERTY_ORIENTATION] = defaultOrientation; - return this; - } - - /** * Crates a new {@link PrinterCapabilitiesInfo} enforcing that all * required properties have need specified. See individual methods * in this class for reference about required attributes. @@ -934,12 +526,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { if (mPrototype.mDefaults[PROPERTY_COLOR_MODE] == DEFAULT_UNDEFINED) { throw new IllegalStateException("No default color mode specified."); } - if (mPrototype.mOrientations == 0) { - throw new IllegalStateException("No oprientation specified."); - } - if (mPrototype.mDefaults[PROPERTY_ORIENTATION] == DEFAULT_UNDEFINED) { - throw new IllegalStateException("No default orientation specified."); - } if (mPrototype.mMinMargins == null) { mPrototype.mMinMargins = new Margins(0, 0, 0, 0); } diff --git a/core/java/android/print/PrinterDiscoverySession.java b/core/java/android/print/PrinterDiscoverySession.java index 46f0bef..64249b4 100644 --- a/core/java/android/print/PrinterDiscoverySession.java +++ b/core/java/android/print/PrinterDiscoverySession.java @@ -38,7 +38,6 @@ public final class PrinterDiscoverySession { private static final int MSG_PRINTERS_ADDED = 1; private static final int MSG_PRINTERS_REMOVED = 2; - private static final int MSG_PRINTERS_UPDATED = 3; private final ArrayMap<PrinterId, PrinterInfo> mPrinters = new ArrayMap<PrinterId, PrinterInfo>(); @@ -200,8 +199,8 @@ public final class PrinterDiscoverySession { final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo addedPrinter = printers.get(i); - if (mPrinters.get(addedPrinter.getId()) == null) { - mPrinters.put(addedPrinter.getId(), addedPrinter); + PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter); + if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) { printersChanged = true; } } @@ -227,25 +226,6 @@ public final class PrinterDiscoverySession { } } - private void handlePrintersUpdated(List<PrinterInfo> printers) { - if (isDestroyed()) { - return; - } - boolean printersChanged = false; - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - printersChanged = true; - } - } - if (printersChanged) { - notifyOnPrintersChanged(); - } - } - private void notifyOnPrintersChanged() { if (mListener != null) { mListener.onPrintersChanged(); @@ -277,11 +257,6 @@ public final class PrinterDiscoverySession { List<PrinterId> printerIds = (List<PrinterId>) message.obj; handlePrintersRemoved(printerIds); } break; - - case MSG_PRINTERS_UPDATED: { - List<PrinterInfo> printers = (List<PrinterInfo>) message.obj; - handlePrintersUpdated(printers); - } break; } } } @@ -311,14 +286,5 @@ public final class PrinterDiscoverySession { printerIds).sendToTarget(); } } - - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - PrinterDiscoverySession session = mWeakSession.get(); - if (session != null) { - session.mHandler.obtainMessage(MSG_PRINTERS_UPDATED, - printers).sendToTarget(); - } - } } } diff --git a/core/java/android/printservice/IPrintServiceClient.aidl b/core/java/android/printservice/IPrintServiceClient.aidl index 1e33fc0..ad3c04f 100644 --- a/core/java/android/printservice/IPrintServiceClient.aidl +++ b/core/java/android/printservice/IPrintServiceClient.aidl @@ -35,5 +35,4 @@ interface IPrintServiceClient { void onPrintersAdded(in List<PrinterInfo> printers); void onPrintersRemoved(in List<PrinterId> printerIds); - void onPrintersUpdated(in List<PrinterInfo> printers); } diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java index 6464cc1..5450e02 100644 --- a/core/java/android/printservice/PrinterDiscoverySession.java +++ b/core/java/android/printservice/PrinterDiscoverySession.java @@ -47,7 +47,7 @@ import java.util.List; * PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared are * removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. Added * printers whose properties or capabilities changed are updated through a call to - * {@link PrinterDiscoverySession#updatePrinters(List)}. The printers added in this + * {@link PrinterDiscoverySession#addPrinters(List)}. The printers added in this * session can be acquired via {@link #getPrinters()} where the returned printers * will be an up-to-date snapshot of the printers that you reported during the * session. Printers are <strong>not</strong> persisted across sessions. @@ -89,6 +89,9 @@ public abstract class PrinterDiscoverySession { private final ArrayMap<PrinterId, PrinterInfo> mPrinters = new ArrayMap<PrinterId, PrinterInfo>(); + private final List<PrinterId> mTrackedPrinters = + new ArrayList<PrinterId>(); + private ArrayMap<PrinterId, PrinterInfo> mLastSentPrinters; private IPrintServiceClient mObserver; @@ -130,7 +133,6 @@ public abstract class PrinterDiscoverySession { * * @see #addPrinters(List) * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #isDestroyed() */ public final List<PrinterInfo> getPrinters() { @@ -142,7 +144,7 @@ public abstract class PrinterDiscoverySession { } /** - * Adds discovered printers. Adding an already added printer has no effect. + * Adds discovered printers. Adding an already added printer updates it. * Removed printers can be added again. You can call this method multiple * times during the life of this session. Duplicates will be ignored. * <p> @@ -153,7 +155,6 @@ public abstract class PrinterDiscoverySession { * @param printers The printers to add. * * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #getPrinters() * @see #isDestroyed() */ @@ -168,18 +169,21 @@ public abstract class PrinterDiscoverySession { if (mIsDiscoveryStarted) { // If during discovery, add the new printers and send them. - List<PrinterInfo> addedPrinters = new ArrayList<PrinterInfo>(); + List<PrinterInfo> addedPrinters = null; final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo addedPrinter = printers.get(i); - if (mPrinters.get(addedPrinter.getId()) == null) { - mPrinters.put(addedPrinter.getId(), addedPrinter); + PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter); + if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) { + if (addedPrinters == null) { + addedPrinters = new ArrayList<PrinterInfo>(); + } addedPrinters.add(addedPrinter); } } // Send the added printers, if such. - if (!addedPrinters.isEmpty()) { + if (addedPrinters != null) { sendAddedPrinters(mObserver, addedPrinters); } } else { @@ -232,7 +236,6 @@ public abstract class PrinterDiscoverySession { * @param printerIds The ids of the removed printers. * * @see #addPrinters(List) - * @see #updatePrinters(List) * @see #getPrinters() * @see #isDestroyed() */ @@ -295,86 +298,6 @@ public abstract class PrinterDiscoverySession { } } - /** - * Updates added printers. Updating a printer that was not added or that - * was removed has no effect. You can call this method multiple times - * during the lifetime of this session. - * <p> - * <strong>Note: </strong> Calls to this method after the session is - * destroyed, that is after the {@link #onDestroy()} callback, will be ignored. - * </p> - * - * @param printers The printers to update. - * - * @see #addPrinters(List) - * @see #removePrinters(List) - * @see #getPrinters() - * @see #isDestroyed() - */ - public final void updatePrinters(List<PrinterInfo> printers) { - PrintService.throwIfNotCalledOnMainThread(); - - // If the session is destroyed - nothing do to. - if (mIsDestroyed) { - Log.w(LOG_TAG, "Not updating printers - session destroyed."); - return; - } - - if (mIsDiscoveryStarted) { - // If during discovery, update existing printers and send them. - List<PrinterInfo> updatedPrinters = new ArrayList<PrinterInfo>(); - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - updatedPrinters.add(updatedPrinter); - } - } - - // Send the updated printers, if such. - if (!updatedPrinters.isEmpty()) { - sendUpdatedPrinters(mObserver, updatedPrinters); - } - } else { - // Remember the last sent printers if needed. - if (mLastSentPrinters == null) { - mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters); - } - - // Update the printers. - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - } - } - } - } - - private static void sendUpdatedPrinters(IPrintServiceClient observer, - List<PrinterInfo> printers) { - try { - final int printerCount = printers.size(); - if (printerCount <= MAX_ITEMS_PER_CALLBACK) { - observer.onPrintersUpdated(printers); - } else { - final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; - for (int i = 0; i < transactionCount; i++) { - final int start = i * MAX_ITEMS_PER_CALLBACK; - final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); - List<PrinterInfo> subPrinters = printers.subList(start, end); - observer.onPrintersUpdated(subPrinters); - } - } - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error sending updated printers", re); - } - } - private void sendOutOfDiscoveryPeriodPrinterChanges() { // Noting changed since the last discovery period - nothing to do. if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) { @@ -382,21 +305,11 @@ public abstract class PrinterDiscoverySession { return; } + // Determine the added printers. List<PrinterInfo> addedPrinters = null; - List<PrinterInfo> updatedPrinters = null; - List<PrinterId> removedPrinterIds = null; - - // Determine the added and updated printers. for (PrinterInfo printer : mPrinters.values()) { PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId()); - if (sentPrinter != null) { - if (!sentPrinter.equals(printer)) { - if (updatedPrinters == null) { - updatedPrinters = new ArrayList<PrinterInfo>(); - } - updatedPrinters.add(printer); - } - } else { + if (sentPrinter == null || !sentPrinter.equals(printer)) { if (addedPrinters == null) { addedPrinters = new ArrayList<PrinterInfo>(); } @@ -409,12 +322,8 @@ public abstract class PrinterDiscoverySession { sendAddedPrinters(mObserver, addedPrinters); } - // Send the updated printers, if such. - if (updatedPrinters != null) { - sendUpdatedPrinters(mObserver, updatedPrinters); - } - // Determine the removed printers. + List<PrinterId> removedPrinterIds = null; for (PrinterInfo sentPrinter : mLastSentPrinters.values()) { if (!mPrinters.containsKey(sentPrinter.getId())) { if (removedPrinterIds == null) { @@ -437,14 +346,15 @@ public abstract class PrinterDiscoverySession { * added via calling {@link #addPrinters(List)}. Added printers that disappeared * should be removed via calling {@link #removePrinters(List)}. Added printers * whose properties or capabilities changed should be updated via calling {@link - * #updatePrinters(List)}. You will receive a call to call to {@link - * #onStopPrinterDiscovery()} when you should stop printer discovery. + * #addPrinters(List)}. You will receive a call to {@link #onStopPrinterDiscovery()} + * when you should stop printer discovery. * <p> * During the lifetime of this session all printers that are known to your print * service have to be added. The system does not retain any printers across sessions. * However, if you were asked to start and then stop performing printer discovery * in this session, then a subsequent discovering should not re-discover already - * discovered printers. + * discovered printers. You can get the printers reported during this session by + * calling {@link #getPrinters()}. * </p> * <p> * <strong>Note: </strong>You are also given a list of printers whose availability @@ -459,7 +369,6 @@ public abstract class PrinterDiscoverySession { * @see #onStopPrinterDiscovery() * @see #addPrinters(List) * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #isPrinterDiscoveryStarted() */ public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList); @@ -476,7 +385,7 @@ public abstract class PrinterDiscoverySession { * Callback asking you to validate that the given printers are valid, that * is they exist. You are responsible for checking whether these printers * exist and for the ones that do exist notify the system via calling - * {@link #updatePrinters(List)}. + * {@link #addPrinters(List)}. * <p> * <strong>Note: </strong> You are <strong>not required</strong> to provide * the printer capabilities when updating the printers that do exist. @@ -484,7 +393,6 @@ public abstract class PrinterDiscoverySession { * * @param printerIds The printers to validate. * - * @see #updatePrinters(List) * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo) * PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo) */ @@ -494,7 +402,7 @@ public abstract class PrinterDiscoverySession { * Callback asking you to start tracking the state of a printer. Tracking * the state means that you should do a best effort to observe the state * of this printer and notify the system if that state changes via calling - * {@link #updatePrinters(List)}. + * {@link #addPrinters(List)}. * <p> * <strong>Note: </strong> A printer can be initially added without its * capabilities to avoid polling printers that the user will not select. @@ -513,7 +421,6 @@ public abstract class PrinterDiscoverySession { * @param printerId The printer to start tracking. * * @see #onStopPrinterStateTracking(PrinterId) - * @see #updatePrinters(List) * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo) * PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo) */ @@ -531,6 +438,32 @@ public abstract class PrinterDiscoverySession { public abstract void onStopPrinterStateTracking(PrinterId printerId); /** + * Gets the printers that should be tracked. These are printers that are + * important to the user and for which you received a call to {@link + * #onStartPrinterStateTracking(PrinterId)} asking you to observer their + * state and reporting it to the system via {@link #addPrinters(List)}. + * You will receive a call to {@link #onStopPrinterStateTracking(PrinterId)} + * if you should stop tracking a printer. + * <p> + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, that is after the {@link #onDestroy()} callback, will be ignored. + * </p> + * + * @return The printers. + * + * @see #onStartPrinterStateTracking(PrinterId) + * @see #onStopPrinterStateTracking(PrinterId) + * @see #isDestroyed() + */ + public final List<PrinterId> getTrackedPrinters() { + PrintService.throwIfNotCalledOnMainThread(); + if (mIsDestroyed) { + return Collections.emptyList(); + } + return new ArrayList<PrinterId>(mTrackedPrinters); + } + + /** * Notifies you that the session is destroyed. After this callback is invoked * any calls to the methods of this class will be ignored, {@link #isDestroyed()} * will return true and you will also no longer receive callbacks. @@ -589,13 +522,16 @@ public abstract class PrinterDiscoverySession { } void startPrinterStateTracking(PrinterId printerId) { - if (!mIsDestroyed && mObserver != null) { + if (!mIsDestroyed && mObserver != null + && !mTrackedPrinters.contains(printerId)) { + mTrackedPrinters.add(printerId); onStartPrinterStateTracking(printerId); } } void stopPrinterStateTracking(PrinterId printerId) { - if (!mIsDestroyed && mObserver != null) { + if (!mIsDestroyed && mObserver != null + && mTrackedPrinters.remove(printerId)) { onStopPrinterStateTracking(printerId); } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 83e1544..a17a537 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -703,6 +703,20 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS"; + /** + * Activity Action: Show the top level print settings. + * <p> + * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_PRINT_SETTINGS = + "android.settings.ACTION_PRINT_SETTINGS"; + // End of Intent actions for Settings /** diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 5361a1e..929a04e 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -42,7 +42,6 @@ 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; @@ -75,8 +74,6 @@ import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; -import libcore.io.IoUtils; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -92,6 +89,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import libcore.io.IoUtils; + /** * Activity for configuring a print job. */ @@ -111,6 +110,9 @@ public class PrintJobConfigActivity extends Activity { private static final int LOADER_ID_PRINTERS_LOADER = 1; + private static final int ORIENTATION_PORTRAIT = 0; + private static final int ORIENTATION_LANDSCAPE = 1; + private static final int DEST_ADAPTER_MAX_ITEM_COUNT = 9; private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE; @@ -343,10 +345,11 @@ public class PrintJobConfigActivity extends Activity { if (!mController.hasStarted()) { mController.start(); } - if (!printAttributesChanged()) { - // If the attributes changed, 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 we handle writing as usual. + if (!printAttributesChanged() && mDocument.info != null) { + // 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 + // we handle writing as usual. handleOnLayoutFinished(mDocument.info, false, mRequestCounter.get()); } else { PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( @@ -394,9 +397,6 @@ public class PrintJobConfigActivity extends Activity { mPrintJobId, info); } - // Update the fitting mode based on the document type. - updateCurrentFittingMode(info); - // If the document info or the layout changed, then // drop the pages since we have to fetch them again. if (infoChanged || layoutChanged) { @@ -526,10 +526,6 @@ public class PrintJobConfigActivity extends Activity { } if (mEditor.isDone()) { - // Update the print attributes based on whether the application - // handled some of the print attribute constraints, e.g. rotation. - updateAndSaveCurrentPrintAttributes(mDocument.info); - if (mEditor.isPrintingToPdf()) { PrintJobInfo printJob = PrintSpoolerService.peekInstance() .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY); @@ -552,58 +548,6 @@ public class PrintJobConfigActivity extends Activity { PrintJobConfigActivity.this.finish(); } - private void updateCurrentFittingMode(PrintDocumentInfo document) { - // Update the fitting mode based on content type. - switch (document.getContentType()) { - case PrintDocumentInfo.CONTENT_TYPE_DOCUMENT: { - mCurrPrintAttributes.setFittingMode( - PrintAttributes.FITTING_MODE_SCALE_TO_FIT); - } break; - - case PrintDocumentInfo.CONTENT_TYPE_PHOTO: { - mCurrPrintAttributes.setFittingMode( - PrintAttributes.FITTING_MODE_SCALE_TO_FILL); - } - } - } - - private void updateAndSaveCurrentPrintAttributes(PrintDocumentInfo document) { - PrintAttributes attributes = mTempPrintAttributes; - attributes.copyFrom(mCurrPrintAttributes); - - // Update the orientation - if (document.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) { - if (attributes.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) { - // If the document is in landscape and we want to print it in - // landscape, then we do not need to rotate, so portrait. - attributes.setOrientation(PrintAttributes.ORIENTATION_PORTRAIT); - } else { - // If the document is in landscape and we want to print it in - // portrait, then we have to rotate the content, so landscape. - attributes.setOrientation(PrintAttributes.ORIENTATION_LANDSCAPE); - } - } - - // Update margins. - Margins documentMargins = document.getMargins(); - if (documentMargins.getLeftMils() != 0 - || documentMargins.getTopMils() != 0 - || documentMargins.getRightMils() != 0 - || documentMargins.getBottomMils() != 0) { - // If the application has applied some of the margins, then - // the printer should only apply the difference. - Margins oldMargins = attributes.getMargins(); - attributes.setMargins(new Margins( - oldMargins.getLeftMils() - documentMargins.getLeftMils(), - oldMargins.getTopMils() - documentMargins.getTopMils(), - oldMargins.getRightMils() - documentMargins.getRightMils(), - oldMargins.getBottomMils() - documentMargins.getBottomMils())); - } - - PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( - mPrintJobId, attributes); - } - private final class ControllerHandler extends Handler { public static final int MSG_ON_LAYOUT_FINISHED = 1; public static final int MSG_ON_LAYOUT_FAILED = 2; @@ -878,7 +822,16 @@ public class PrintJobConfigActivity extends Activity { } SpinnerItem<Integer> orientationItem = mOrientationSpinnerAdapter.getItem(position); - mCurrPrintAttributes.setOrientation(orientationItem.value); + MediaSize mediaSize = mCurrPrintAttributes.getMediaSize(); + if (orientationItem.value == ORIENTATION_PORTRAIT) { + if (!mediaSize.isPortrait()) { + mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait()); + } + } else { + if (mediaSize.isPortrait()) { + mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape()); + } + } if (!hasErrors()) { mController.update(); } @@ -1108,6 +1061,12 @@ public class PrintJobConfigActivity extends Activity { mOrientationSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); + String[] orientationLabels = getResources().getStringArray( + R.array.orientation_labels); + mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>( + ORIENTATION_PORTRAIT, orientationLabels[0])); + mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>( + ORIENTATION_LANDSCAPE, orientationLabels[1])); // Range options mRangeOptionsSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( @@ -1604,7 +1563,7 @@ public class PrintJobConfigActivity extends Activity { oldMediaSizeNewIndex = i; } mMediaSizeSpinnerAdapter.add(new SpinnerItem<MediaSize>( - mediaSize, mediaSize.getLabel())); + mediaSize, mediaSize.getLabel(getPackageManager()))); } if (mediaSizeCount <= 0) { @@ -1693,68 +1652,7 @@ public class PrintJobConfigActivity extends Activity { } mColorModeSpinner.setEnabled(true); - // Orientation. - final int orientations = capabilities.getOrientations(); - - // If the orientations changed, we update the adapter and the spinner. - boolean orientationsChanged = false; - if (Integer.bitCount(orientations) != mOrientationSpinnerAdapter.getCount()) { - orientationsChanged = true; - } else { - int remainingOrientations = orientations; - int adapterIndex = 0; - while (remainingOrientations != 0) { - final int orientationBitOffset = Integer.numberOfTrailingZeros( - remainingOrientations); - final int orientation = 1 << orientationBitOffset; - remainingOrientations &= ~orientation; - if (orientation != mOrientationSpinnerAdapter.getItem( - adapterIndex).value) { - orientationsChanged = true; - break; - } - adapterIndex++; - } - } - if (orientationsChanged) { - // Remember the old orientation to try selecting it again. - int oldOrientationNewIndex = AdapterView.INVALID_POSITION; - final int oldOrientation = mCurrPrintAttributes.getOrientation(); - - mOrientationSpinnerAdapter.clear(); - String[] orientationLabels = getResources().getStringArray( - R.array.orientation_labels); - int remainingOrientations = orientations; - while (remainingOrientations != 0) { - final int orientationBitOffset = Integer.numberOfTrailingZeros( - remainingOrientations); - final int orientation = 1 << orientationBitOffset; - if (orientation == oldOrientation) { - // Update the index of the old selection. - oldOrientationNewIndex = orientationBitOffset; - } - remainingOrientations &= ~orientation; - mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(orientation, - orientationLabels[orientationBitOffset])); - } - final int orientationCount = Integer.bitCount(orientations); - if (orientationCount <= 0) { - mOrientationSpinner.setEnabled(false); - mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION); - } else { - mOrientationSpinner.setEnabled(true); - if (oldOrientationNewIndex != AdapterView.INVALID_POSITION) { - // Select the old orientation - nothing really changed. - setOrientationSpinnerSelectionNoCallback(oldOrientationNewIndex); - } else { - final int selectedOrientationIndex = Integer.numberOfTrailingZeros( - (orientations & defaultAttributes.getOrientation())); - someAttributeSelectionChanged = - setOrientationSpinnerSelectionNoCallback( - selectedOrientationIndex); - } - } - } + // Orientation mOrientationSpinner.setEnabled(true); // Range options @@ -1858,15 +1756,6 @@ public class PrintJobConfigActivity extends Activity { return false; } - private boolean setOrientationSpinnerSelectionNoCallback(int position) { - if (mOrientationSpinner.getSelectedItemPosition() != position) { - mIgnoreNextOrientationChange = true; - mOrientationSpinner.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 @@ -1881,7 +1770,7 @@ public class PrintJobConfigActivity extends Activity { } if (!mOrientationSpinnerAdapter.isEmpty()) { mIgnoreNextOrientationChange = true; - mOrientationSpinnerAdapter.clear(); + mOrientationSpinner.setSelection(0); } if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { mIgnoreNextRangeOptionChange = true; @@ -2102,18 +1991,13 @@ public class PrintJobConfigActivity extends Activity { PrinterCapabilitiesInfo capabilities = new PrinterCapabilitiesInfo.Builder(printerId) - .addMediaSize(MediaSize.createMediaSize(getPackageManager(), - MediaSize.ISO_A4), true) - .addMediaSize(MediaSize.createMediaSize(getPackageManager(), - MediaSize.NA_LETTER), false) + .addMediaSize(MediaSize.ISO_A4, true) + .addMediaSize(MediaSize.NA_LETTER, false) .addResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300), true) .setColorModes(PrintAttributes.COLOR_MODE_COLOR | PrintAttributes.COLOR_MODE_MONOCHROME, PrintAttributes.COLOR_MODE_COLOR) - .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT - | PrintAttributes.ORIENTATION_LANDSCAPE, - PrintAttributes.ORIENTATION_PORTRAIT) .create(); return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf), diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java index dd2598c..00c9a68 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java @@ -36,7 +36,6 @@ import android.print.PrintAttributes; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; -import android.print.PrintAttributes.Tray; import android.print.PrintDocumentInfo; import android.print.PrintJobInfo; import android.print.PrintManager; @@ -51,8 +50,6 @@ import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; import com.android.internal.util.FastXmlSerializer; -import libcore.io.IoUtils; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -65,6 +62,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import libcore.io.IoUtils; + /** * Service for exposing some of the {@link PrintSpooler} functionality to * another process. @@ -676,6 +675,8 @@ public final class PrintSpoolerService extends Service { private static final String ATTR_ID = "id"; private static final String ATTR_LABEL = "label"; + private static final String ATTR_LABEL_RES_ID = "labelResId"; + private static final String ATTR_PACKAGE_NAME = "packageName"; private static final String ATTR_STATE = "state"; private static final String ATTR_APP_ID = "appId"; private static final String ATTR_USER_ID = "userId"; @@ -685,13 +686,8 @@ public final class PrintSpoolerService extends Service { private static final String TAG_MEDIA_SIZE = "mediaSize"; private static final String TAG_RESOLUTION = "resolution"; private static final String TAG_MARGINS = "margins"; - private static final String TAG_INPUT_TRAY = "inputTray"; - private static final String TAG_OUTPUT_TRAY = "outputTray"; - private static final String ATTR_DUPLEX_MODE = "duplexMode"; private static final String ATTR_COLOR_MODE = "colorMode"; - private static final String ATTR_FITTING_MODE = "fittingMode"; - private static final String ATTR_ORIENTATION = "orientation"; private static final String ATTR_LOCAL_ID = "printerName"; private static final String ATTR_SERVICE_NAME = "serviceName"; @@ -806,32 +802,31 @@ public final class PrintSpoolerService extends Service { if (attributes != null) { serializer.startTag(null, TAG_ATTRIBUTES); - final int duplexMode = attributes.getDuplexMode(); - serializer.attribute(null, ATTR_DUPLEX_MODE, - String.valueOf(duplexMode)); - final int colorMode = attributes.getColorMode(); serializer.attribute(null, ATTR_COLOR_MODE, String.valueOf(colorMode)); - final int fittingMode = attributes.getFittingMode(); - serializer.attribute(null, ATTR_FITTING_MODE, - String.valueOf(fittingMode)); - - final int orientation = attributes.getOrientation(); - serializer.attribute(null, ATTR_ORIENTATION, - String.valueOf(orientation)); - MediaSize mediaSize = attributes.getMediaSize(); if (mediaSize != null) { serializer.startTag(null, TAG_MEDIA_SIZE); serializer.attribute(null, ATTR_ID, mediaSize.getId()); - serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel() - .toString()); serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf( mediaSize.getWidthMils())); serializer.attribute(null, ATTR_HEIGHT_MILS, String.valueOf( mediaSize.getHeightMils())); + // Store only the platform localized versions of the label + // since the resource ids for a print service are not stable + // across application versions. + if ("android".equals(mediaSize.mPackageName) + && mediaSize.mLabelResId > 0) { + serializer.attribute(null, ATTR_PACKAGE_NAME, + mediaSize.mPackageName); + serializer.attribute(null, ATTR_LABEL_RES_ID, + String.valueOf(mediaSize.mLabelResId)); + } else { + serializer.attribute(null, ATTR_LABEL, + mediaSize.getLabel(getPackageManager())); + } serializer.endTag(null, TAG_MEDIA_SIZE); } @@ -839,12 +834,23 @@ public final class PrintSpoolerService extends Service { if (resolution != null) { serializer.startTag(null, TAG_RESOLUTION); serializer.attribute(null, ATTR_ID, resolution.getId()); - serializer.attribute(null, ATTR_LABEL, resolution.getLabel() - .toString()); serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf( resolution.getHorizontalDpi())); serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf( resolution.getVerticalDpi())); + // Store only the platform localized versions of the label + // since the resource ids for a print service are not stable + // across application versions. + if ("android".equals(resolution.mPackageName) + && resolution.mLabelResId > 0) { + serializer.attribute(null, ATTR_PACKAGE_NAME, + resolution.mPackageName); + serializer.attribute(null, ATTR_LABEL_RES_ID, + String.valueOf(resolution.mLabelResId)); + } else { + serializer.attribute(null, ATTR_LABEL, + resolution.getLabel(getPackageManager())); + } serializer.endTag(null, TAG_RESOLUTION); } @@ -862,24 +868,6 @@ public final class PrintSpoolerService extends Service { serializer.endTag(null, TAG_MARGINS); } - Tray inputTray = attributes.getInputTray(); - if (inputTray != null) { - serializer.startTag(null, TAG_INPUT_TRAY); - serializer.attribute(null, ATTR_ID, inputTray.getId()); - serializer.attribute(null, ATTR_LABEL, inputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_INPUT_TRAY); - } - - Tray outputTray = attributes.getOutputTray(); - if (outputTray != null) { - serializer.startTag(null, TAG_OUTPUT_TRAY); - serializer.attribute(null, ATTR_ID, outputTray.getId()); - serializer.attribute(null, ATTR_LABEL, outputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_OUTPUT_TRAY); - } - serializer.endTag(null, TAG_ATTRIBUTES); } @@ -1026,18 +1014,9 @@ public final class PrintSpoolerService extends Service { PrintAttributes.Builder builder = new PrintAttributes.Builder(); - String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE); - builder.setDuplexMode(Integer.parseInt(duplexMode)); - String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE); builder.setColorMode(Integer.parseInt(colorMode)); - String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE); - builder.setFittingMode(Integer.parseInt(fittingMode)); - - String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION); - builder.setOrientation(Integer.parseInt(orientation)); - parser.next(); skipEmptyTextTags(parser); @@ -1048,7 +1027,12 @@ public final class PrintSpoolerService extends Service { ATTR_WIDTH_MILS)); final int heightMils = Integer.parseInt(parser.getAttributeValue(null, ATTR_HEIGHT_MILS)); - MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils); + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); + final int labelResId = Integer.parseInt(parser.getAttributeValue(null, + ATTR_LABEL_RES_ID)); + label = parser.getAttributeValue(null, ATTR_LABEL); + MediaSize mediaSize = new MediaSize(id, label, packageName, labelResId, + widthMils, heightMils); builder.setMediaSize(mediaSize); parser.next(); skipEmptyTextTags(parser); @@ -1064,7 +1048,11 @@ public final class PrintSpoolerService extends Service { ATTR_HORIZONTAL_DPI)); final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null, ATTR_VERTICAL_DPI)); - Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi); + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); + final int labelResId = Integer.parseInt( + parser.getAttributeValue(null, ATTR_LABEL_RES_ID)); + Resolution resolution = new Resolution(id, label, packageName, labelResId, + horizontalDpi, verticalDpi); builder.setResolution(resolution); parser.next(); skipEmptyTextTags(parser); @@ -1090,30 +1078,6 @@ public final class PrintSpoolerService extends Service { parser.next(); } - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setInputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setOutputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY); - parser.next(); - } - printJob.setAttributes(builder.create()); skipEmptyTextTags(parser); diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java index 3c67aa9..2ded202 100644 --- a/services/java/com/android/server/print/RemotePrintService.java +++ b/services/java/com/android/server/print/RemotePrintService.java @@ -684,20 +684,6 @@ final class RemotePrintService implements DeathRecipient { } } - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - RemotePrintService service = mWeakService.get(); - if (service != null) { - throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers); - final long identity = Binder.clearCallingIdentity(); - try { - service.mUserState.onPrintersUpdated(printers); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - private void throwIfPrinterIdsForPrinterInfoTampered(ComponentName serviceName, List<PrinterInfo> printerInfos) { final int printerInfoCount = printerInfos.size(); diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index b9c676d..8fe979b 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -276,22 +276,6 @@ final class UserState implements PrintSpoolerCallbacks { } } - public void onPrintersUpdated(List<PrinterInfo> printers) { - synchronized (mLock) { - throwIfDestroyedLocked(); - // No services - nothing to do. - if (mActiveServices.isEmpty()) { - return; - } - // No session - nothing to do. - if (mPrinterDiscoverySession == null) { - return; - } - // Request an updated. - mPrinterDiscoverySession.onPrintersUpdatedLocked(printers); - } - } - public void updateIfNeededLocked() { throwIfDestroyedLocked(); if (readConfigurationLocked()) { @@ -746,8 +730,8 @@ final class UserState implements PrintSpoolerCallbacks { final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo printer = printers.get(i); - if (!mPrinters.containsKey(printer.getId())) { - mPrinters.put(printer.getId(), printer); + PrinterInfo oldPrinter = mPrinters.put(printer.getId(), printer); + if (oldPrinter == null || !oldPrinter.equals(printer)) { if (addedPrinters == null) { addedPrinters = new ArrayList<PrinterInfo>(); } @@ -785,32 +769,6 @@ final class UserState implements PrintSpoolerCallbacks { } } - public void onPrintersUpdatedLocked(List<PrinterInfo> printers) { - if (DEBUG) { - Log.i(LOG_TAG, "onPrintersUpdatedLocked()"); - } - if (mIsDestroyed) { - Log.w(LOG_TAG, "Not updating printers - session destroyed"); - return; - } - List<PrinterInfo> updatedPrinters = null; - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - if (mPrinters.containsKey(updatedPrinter.getId())) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - if (updatedPrinters == null) { - updatedPrinters = new ArrayList<PrinterInfo>(); - } - updatedPrinters.add(updatedPrinter); - } - } - if (updatedPrinters != null) { - mHandler.obtainMessage(SessionHandler.MSG_DISPATCH_PRINTERS_UPDATED, - updatedPrinters).sendToTarget(); - } - } - public void onServiceRemovedLocked(ComponentName serviceName) { if (mIsDestroyed) { Log.w(LOG_TAG, "Not updating removed service - session destroyed"); @@ -874,15 +832,6 @@ final class UserState implements PrintSpoolerCallbacks { mDiscoveryObservers.finishBroadcast(); } - private void handleDispatchPrintersUpdated(List<PrinterInfo> updatedPrinters) { - final int observerCount = mDiscoveryObservers.beginBroadcast(); - for (int i = 0; i < observerCount; i++) { - IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); - handlePrintersUpdated(observer, updatedPrinters); - } - mDiscoveryObservers.finishBroadcast(); - } - private void handleDispatchCreatePrinterDiscoverySession( List<RemotePrintService> services) { final int serviceCount = services.size(); @@ -976,43 +925,21 @@ final class UserState implements PrintSpoolerCallbacks { } } - private void handlePrintersUpdated(IPrinterDiscoveryObserver observer, - List<PrinterInfo> updatedPrinters) { - try { - final int printerCount = updatedPrinters.size(); - if (printerCount <= MAX_ITEMS_PER_CALLBACK) { - observer.onPrintersUpdated(updatedPrinters); - } else { - // Send the added printers in chunks avoiding the binder transaction limit. - final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; - for (int i = 0; i < transactionCount; i++) { - final int start = i * MAX_ITEMS_PER_CALLBACK; - final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); - List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end); - observer.onPrintersUpdated(subPrinters); - } - } - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error sending updated printers", re); - } - } - private final class SessionHandler extends Handler { public static final int MSG_PRINTERS_ADDED = 1; public static final int MSG_PRINTERS_REMOVED = 2; public static final int MSG_DISPATCH_PRINTERS_ADDED = 3; public static final int MSG_DISPATCH_PRINTERS_REMOVED = 4; - public static final int MSG_DISPATCH_PRINTERS_UPDATED = 5; - - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 6; - public static final int MSG_START_PRINTER_DISCOVERY = 7; - public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 8; - public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 9; - public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 10; - public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 11; - public static final int MSG_VALIDATE_PRINTERS = 12; - public static final int MSG_START_PRINTER_STATE_TRACKING = 13; - public static final int MSG_STOP_PRINTER_STATE_TRACKING = 14; + + public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 5; + public static final int MSG_START_PRINTER_DISCOVERY = 6; + public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 7; + public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 8; + public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 9; + public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 10; + public static final int MSG_VALIDATE_PRINTERS = 11; + public static final int MSG_START_PRINTER_STATE_TRACKING = 12; + public static final int MSG_STOP_PRINTER_STATE_TRACKING = 13; SessionHandler(Looper looper) { super(looper, null, false); @@ -1048,11 +975,6 @@ final class UserState implements PrintSpoolerCallbacks { handleDispatchPrintersRemoved(removedPrinterIds); } break; - case MSG_DISPATCH_PRINTERS_UPDATED: { - List<PrinterInfo> updatedPrinters = (List<PrinterInfo>) message.obj; - handleDispatchPrintersUpdated(updatedPrinters); - } break; - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { RemotePrintService service = (RemotePrintService) message.obj; service.createPrinterDiscoverySession(); |