OSDN Git Service

Print API updated.
authorSvetoslav <svetoslavganov@google.com>
Tue, 3 Sep 2013 21:01:43 +0000 (14:01 -0700)
committerSvetoslav <svetoslavganov@google.com>
Thu, 5 Sep 2013 04:06:12 +0000 (21:06 -0700)
1. Removed the updatePrinters API on PrinterDiscoverySession.
   Now re-adding a printer updates it.

2. Added getTrackedPrinters() API to allow a print service to
   figure out which printers' state should be tracked by the
   service.

3. Removed the APIs on PrintDocumentInfo that describe the
   layout of the content as they are not needed. For example,
   if the print attributes passed in layout require landscape
   mode, the the app should just create a PDF page with the
   wider side up and draw its content in portrait. The printer
   will then rotate the page.

Change-Id: Idd72c6e9c129e8b17eef1236573a99773f8ff0a2

14 files changed:
api/current.txt
core/java/android/print/IPrinterDiscoveryObserver.aidl
core/java/android/print/PrintAttributes.java
core/java/android/print/PrintDocumentAdapter.java
core/java/android/print/PrintDocumentInfo.java
core/java/android/print/PrinterCapabilitiesInfo.java
core/java/android/print/PrinterDiscoverySession.java
core/java/android/printservice/IPrintServiceClient.aidl
core/java/android/printservice/PrinterDiscoverySession.java
core/java/android/provider/Settings.java
packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
services/java/com/android/server/print/RemotePrintService.java
services/java/com/android/server/print/UserState.java

index 063f6da..3887630 100644 (file)
@@ -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();
index 625f383..71198f7 100644 (file)
@@ -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);
 }
index caa10ae..f975ebd 100644 (file)
@@ -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;
-
-
-        // 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 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;
+        /** 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 Tabloid media size: 11" x 17"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_TBLOID = 305;
-
-        /**
-         * Creates a standard media size with a localized label.
-         *
-         * @param pm Package manager used to load the label.
-         * @param mediaSize Media size constant.
-         * @return A {@link MediaSize} instance with a localized label.
-         */
-        public static MediaSize createMediaSize(PackageManager pm, int mediaSize) {
-            final Resources resources;
-            try {
-                resources = pm.getResourcesForApplication("android");
-            } catch (NameNotFoundException nnfe) {
-                return null;
-            }
-            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.");
-                }
-            }
-        }
+        // North America
+
+        /** 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);
 
         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 mWidthMils;
         private final int mHeightMils;
 
         /**
-         * Creates a new instance.
+         * 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.
+         *
+         * @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).
+         *
+         * @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 MediaSize(String id, String packageName, int labelResId,
+                int widthMils, int heightMils) {
+            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 (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;
+        }
+
+        /**
+         * 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.
index 33b4aad..bb26a3a 100644 (file)
@@ -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
index f2b91ae..7a96e69 100644 (file)
@@ -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.
index 941e6e1..ea44c87 100644 (file)
@@ -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);
             }
index 46f0bef..64249b4 100644 (file)
@@ -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();
-            }
-        }
     }
 }
index 1e33fc0..ad3c04f 100644 (file)
@@ -35,5 +35,4 @@ interface IPrintServiceClient {
 
     void onPrintersAdded(in List<PrinterInfo> printers);
     void onPrintersRemoved(in List<PrinterId> printerIds);
-    void onPrintersUpdated(in List<PrinterInfo> printers);
 }
index 6464cc1..5450e02 100644 (file)
@@ -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);
         }
     }
index 83e1544..a17a537 100644 (file)
@@ -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
 
     /**
index 5361a1e..929a04e 100644 (file)
@@ -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),
index dd2598c..00c9a68 100644 (file)
@@ -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);
index 3c67aa9..2ded202 100644 (file)
@@ -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();
index b9c676d..8fe979b 100644 (file)
@@ -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();