Update the documentaton of the android.print package.

bug:10551786
bug:10551697
bug:10705082
bug:10741641
bug:11318976
bug:10550979
bug:10551761

Change-Id: I46ceb66a69b6d32d6b417356178f67f2e25e891a
diff --git a/core/java/android/print/PageRange.java b/core/java/android/print/PageRange.java
index cdcd0c7..d6320f0 100644
--- a/core/java/android/print/PageRange.java
+++ b/core/java/android/print/PageRange.java
@@ -39,9 +39,8 @@
      * @param start The start page index (zero based and inclusive).
      * @param end The end page index (zero based and inclusive).
      *
-     * @throws IllegalArgumentException If start is less than zero.
-     * @throws IllegalArgumentException If end is less than zero.
-     * @throws IllegalArgumentException If start greater than end.
+     * @throws IllegalArgumentException If start is less than zero or end
+     * is less than zero or start greater than end.
      */
     public PageRange(int start, int end) {
         if (start < 0) {
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index e1a9cb7..c6254e0 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -30,7 +30,11 @@
 import java.util.Map;
 
 /**
- * This class represents the attributes of a print job.
+ * This class represents the attributes of a print job. These attributes
+ * describe how the printed content should be laid out. For example, the
+ * print attributes may state that the content should be laid out on a
+ * letter size with 300 DPI (dots per inch) resolution, have a margin of
+ * 10 mills (thousand of an inch) on all sides, and be black and white.
  */
 public final class PrintAttributes implements Parcelable {
     /** Color mode: Monochrome color scheme, for example one color is used. */
@@ -277,7 +281,7 @@
          * Unknown media size in portrait mode.
          * <p>
          * <strong>Note: </strong>This is for specifying orientation without media
-         * size. You should not use the dimensions reported by this class.
+         * size. You should not use the dimensions reported by this instance.
          * </p>
          */
         public static final MediaSize UNKNOWN_PORTRAIT =
@@ -288,7 +292,7 @@
          * Unknown media size in landscape mode.
          * <p>
          * <strong>Note: </strong>This is for specifying orientation without media
-         * size. You should not use the dimensions reported by this class.
+         * size. You should not use the dimensions reported by this instance.
          * </p>
          */
         public static final MediaSize UNKNOWN_LANDSCAPE =
@@ -615,9 +619,7 @@
         private final int mHeightMils;
 
         /**
-         * 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.
+         * Creates a new instance.
          *
          * @param id The unique media size id.
          * @param packageName The name of the creating package.
@@ -625,10 +627,9 @@
          * @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.
+         * @throws IllegalArgumentException If the id is empty or the label
+         * is empty or the widthMils is less than or equal to zero or the
+         * heightMils is less than or equal to zero.
          *
          * @hide
          */
@@ -667,14 +668,13 @@
          *
          * @param id The unique media size id. It is unique amongst other media sizes
          *        supported by the printer.
-         * @param label The <strong>internationalized</strong> human readable label.
+         * @param label The <strong>localized</strong> 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.
+         * @throws IllegalArgumentException If the id is empty or the label is empty
+         * or the widthMils is less than or equal to zero or the heightMils is less
+         * than or equal to zero.
          */
         public MediaSize(String id, String label, int widthMils, int heightMils) {
             if (TextUtils.isEmpty(id)) {
@@ -776,12 +776,16 @@
         }
 
         /**
-         * Returns a new media size in a portrait orientation
+         * Returns a new media size instance in a portrait orientation,
          * which is the height is the greater dimension.
          *
-         * @return New instance in landscape orientation.
+         * @return New instance in landscape orientation if this one
+         * is in landscape, otherwise this instance.
          */
         public MediaSize asPortrait() {
+            if (isPortrait()) {
+                return this;
+            }
             return new MediaSize(mId, mLabel, mPackageName,
                     Math.min(mWidthMils, mHeightMils),
                     Math.max(mWidthMils, mHeightMils),
@@ -789,12 +793,16 @@
         }
 
         /**
-         * Returns a new media size in a landscape orientation
+         * Returns a new media size instance in a landscape orientation,
          * which is the height is the lesser dimension.
          *
-         * @return New instance in landscape orientation.
+         * @return New instance in landscape orientation if this one
+         * is in portrait, otherwise this instance.
          */
         public MediaSize asLandscape() {
+            if (!isPortrait()) {
+                return this;
+            }
             return new MediaSize(mId, mLabel, mPackageName,
                     Math.max(mWidthMils, mHeightMils),
                     Math.min(mWidthMils, mHeightMils),
@@ -881,8 +889,8 @@
      * This class specifies a supported resolution in DPI (dots per inch).
      * Resolution defines how many points with different color can be placed
      * on one inch in horizontal or vertical direction of the target media.
-     * For example, a printer with 600DIP can produce higher quality images
-     * the one with 300DPI resolution.
+     * For example, a printer with 600 DPI can produce higher quality images
+     * the one with 300 DPI resolution.
      */
     public static final class Resolution {
         private final String mId;
@@ -895,14 +903,13 @@
          *
          * @param id The unique resolution id. It is unique amongst other resolutions
          *        supported by the printer.
-         * @param label The <strong>internationalized</strong> human readable label.
+         * @param label The <strong>localized</strong> human readable label.
          * @param horizontalDpi The horizontal resolution in DPI (dots per inch).
          * @param verticalDpi The vertical resolution in DPI (dots per inch).
          *
-         * @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.
+         * @throws IllegalArgumentException If the id is empty or the label is empty
+         * or the horizontalDpi is less than or equal to zero or the verticalDpi is
+         * less than or equal to zero.
          */
         public Resolution(String id, String label, int horizontalDpi, int verticalDpi) {
             if (TextUtils.isEmpty(id)) {
diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java
index 4113ac7..9e811a6 100644
--- a/core/java/android/print/PrintDocumentAdapter.java
+++ b/core/java/android/print/PrintDocumentAdapter.java
@@ -38,15 +38,46 @@
  * </li>
  * <li>
  * After every call to {@link #onLayout(PrintAttributes, PrintAttributes,
- * CancellationSignal, LayoutResultCallback, Bundle)}, you may get a call to
- * {@link #onWrite(PageRange[], ParcelFileDescriptor, CancellationSignal, WriteResultCallback)}
- * asking you to write a PDF file with the content for specific pages.
+ * CancellationSignal, LayoutResultCallback, Bundle)}, you <strong>may</strong> get
+ * a call to {@link #onWrite(PageRange[], ParcelFileDescriptor, CancellationSignal,
+ * WriteResultCallback)} asking you to write a PDF file with the content for
+ * specific pages.
  * </li>
  * <li>
  * Finally, you will receive a call to {@link #onFinish()}. You can use this
  * callback to release resources allocated in {@link #onStart()}.
  * </li>
  * </ul>
+ * <p>
+ * The {@link #onStart()} callback is always the first call you will receive and
+ * is useful for doing one time setup or resource allocation before printing. You
+ * will not receive a subsequent call here.
+ * </p>
+ * <p>
+ * The {@link #onLayout(PrintAttributes, PrintAttributes, CancellationSignal,
+ * LayoutResultCallback, Bundle)} callback requires that you layout the content
+ * based on the current {@link PrintAttributes}. The execution of this method is
+ * not considered completed until you invoke one of the methods on the passed in
+ * callback instance. Hence, you will not receive a subsequent call to any other
+ * method of this class until the execution of this method is complete by invoking
+ * one of the callback methods.
+ * </p>
+ * <p>
+ * The {@link #onWrite(PageRange[], ParcelFileDescriptor, CancellationSignal,
+ * WriteResultCallback)} requires that you render and write the content of some
+ * pages to the provided destination. The execution of this method is not
+ * considered complete until you invoke one of the methods on the passed in
+ * callback instance. Hence, you will not receive a subsequent call to any other
+ * method of this class until the execution of this method is complete by invoking
+ * one of the callback methods. You will never receive a sequence of one or more
+ * calls to this method without a previous call to {@link #onLayout(PrintAttributes,
+ * PrintAttributes, CancellationSignal, LayoutResultCallback, Bundle)}.
+ * </p>
+ * <p>
+ * The {@link #onFinish()} callback is always the last call you will receive and
+ * is useful for doing one time cleanup or resource deallocation after printing.
+ * You will not receive a subsequent call here.
+ * </p>
  * </p>
  * <h3>Implementation</h3>
  * <p>
@@ -54,7 +85,11 @@
  * of the work on an arbitrary thread. For example, if the printed content
  * does not depend on the UI state, i.e. on what is shown on the screen, then
  * you can offload the entire work on a dedicated thread, thus making your
- * application interactive while the print work is being performed.
+ * application interactive while the print work is being performed. Note that
+ * while your activity is covered by the system print UI and a user cannot
+ * interact with it, doing the printing work on the main application thread
+ * may affect the performance of your other application components as they
+ * are also executed on that thread.
  * </p>
  * <p>
  * You can also do work on different threads, for example if you print UI
@@ -64,7 +99,7 @@
  * This will ensure that the UI does not change while you are laying out the
  * printed content. Then you can handle {@link #onWrite(PageRange[], ParcelFileDescriptor,
  * CancellationSignal, WriteResultCallback)} and {@link #onFinish()} on another
- * thread. This will ensure that the UI is frozen for the minimal amount of
+ * thread. This will ensure that the main thread is busy for a minimal amount of
  * time. Also this assumes that you will generate the printed content in
  * {@link #onLayout(PrintAttributes, PrintAttributes, CancellationSignal,
  * LayoutResultCallback, Bundle)} which is not mandatory. If you use multiple
@@ -76,6 +111,12 @@
     /**
      * Extra: mapped to a boolean value that is <code>true</code> if
      * the current layout is for a print preview, <code>false</code> otherwise.
+     * This extra is provided in the {@link Bundle} argument of the {@link
+     * #onLayout(PrintAttributes, PrintAttributes, CancellationSignal,
+     * LayoutResultCallback, Bundle)} callback.
+     *
+     * @see #onLayout(PrintAttributes, PrintAttributes, CancellationSignal,
+     * LayoutResultCallback, Bundle)
      */
     public static final String EXTRA_PRINT_PREVIEW = "EXTRA_PRINT_PREVIEW";
 
@@ -95,17 +136,20 @@
      * After you are done laying out, you <strong>must</strong> invoke: {@link
      * LayoutResultCallback#onLayoutFinished(PrintDocumentInfo, boolean)} with
      * the last argument <code>true</code> or <code>false</code> depending on
-     * whether the layout changed the content or not, respectively; and {@link
-     * LayoutResultCallback#onLayoutFailed(CharSequence)}, if an error occurred.
-     * Note that you must call one of the methods of the given callback.
+     * whether the layout changed the content or not, respectively; or {@link
+     * LayoutResultCallback#onLayoutFailed(CharSequence)}, if an error occurred;
+     * or {@link LayoutResultCallback#onLayoutCancelled()} if layout was
+     * cancelled in a response to a cancellation request via the passed in
+     * {@link CancellationSignal}. Note that you <strong>must</strong> call one of
+     * the methods of the given callback for this method to be considered complete.
      * </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
      * CancellationSignal} upon invocation of which you should stop the
-     * layout. The cancellation callback will not be made on the main
-     * thread.
+     * layout. The cancellation callback <strong>will not</strong> be made on
+     * the main thread.
      * </p>
      *
      * @param oldAttributes The old print attributes.
@@ -128,10 +172,12 @@
      * on the main thread.
      *<p>
      * After you are done writing, you should close the file descriptor and
-     * invoke {@link WriteResultCallback #onWriteFinished(PageRange[]), if writing
+     * invoke {@link WriteResultCallback#onWriteFinished(PageRange[])}, if writing
      * completed successfully; or {@link WriteResultCallback#onWriteFailed(
-     * CharSequence)}, if an error occurred. Note that you must call one of
-     * the methods of the given callback.
+     * CharSequence)}, if an error occurred; or {@link WriteResultCallback#onWriteCancelled()},
+     * if writing was cancelled in a response to a cancellation request via the passed
+     * in {@link CancellationSignal}. Note that you <strong>must</strong> call one of
+     * the methods of the given callback for this method to be considered complete.
      * </p>
      * <p>
      * <strong>Note:</strong> If the printed content is large, it is a good
@@ -178,7 +224,8 @@
         /**
          * Notifies that all the data was written.
          *
-         * @param pages The pages that were written. Cannot be null or empty.
+         * @param pages The pages that were written. Cannot be <code>null</code>
+         * or empty.
          */
         public void onWriteFinished(PageRange[] pages) {
             /* do nothing - stub */
@@ -187,7 +234,8 @@
         /**
          * Notifies that an error occurred while writing the data.
          *
-         * @param error Error message. May be null if error is unknown.
+         * @param error The <strong>localized</strong> error message.
+         * shown to the user. May be <code>null</code> if error is unknown.
          */
         public void onWriteFailed(CharSequence error) {
             /* do nothing - stub */
@@ -218,7 +266,7 @@
         /**
          * Notifies that the layout finished and whether the content changed.
          *
-         * @param info An info object describing the document. Cannot be null.
+         * @param info An info object describing the document. Cannot be <code>null</code>.
          * @param changed Whether the layout changed.
          *
          * @see PrintDocumentInfo
@@ -230,7 +278,8 @@
         /**
          * Notifies that an error occurred while laying out the document.
          *
-         * @param error Error message. May be null if error is unknown.
+         * @param error The <strong>localized</strong> error message.
+         * shown to the user. May be <code>null</code> if error is unknown.
          */
         public void onLayoutFailed(CharSequence error) {
             /* do nothing - stub */
diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java
index b721ef4..928be6c 100644
--- a/core/java/android/print/PrintDocumentInfo.java
+++ b/core/java/android/print/PrintDocumentInfo.java
@@ -21,12 +21,56 @@
 import android.text.TextUtils;
 
 /**
- * This class encapsulates information about a printed document.
+ * This class encapsulates information about a document for printing
+ * purposes. This meta-data is used by the platform and print services,
+ * components that interact with printers. For example, this class
+ * contains the number of pages contained in the document it describes and
+ * this number of pages is shown to the user allowing him/her to select
+ * the range to print. Also a print service may optimize the printing
+ * process based on the content type, such as document or photo.
+ * <p>
+ * Instances of this class are created by the printing application and
+ * passed to the {@link PrintDocumentAdapter.LayoutResultCallback#onLayoutFinished(
+ * PrintDocumentInfo, boolean) PrintDocumentAdapter.LayoutResultCallback.onLayoutFinished(
+ * PrintDocumentInfo, boolean)} callback after successfully laying out the
+ * content which is performed in {@link PrintDocumentAdapter#onLayout(PrintAttributes,
+ * PrintAttributes, android.os.CancellationSignal, PrintDocumentAdapter.LayoutResultCallback,
+ * android.os.Bundle) PrintDocumentAdapter.onLayout(PrintAttributes,
+ * PrintAttributes, android.os.CancellationSignal,
+ * PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle)}.
+ * </p>
+ * <p>
+ * An example usage looks like this:
+ * <pre>
+ *
+ * . . .
+ *
+ * public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
+ *         CancellationSignal cancellationSignal, LayoutResultCallback callback,
+ *         Bundle metadata) {
+ *
+ *        // Assume the app defined a LayoutResult class which contains
+ *        // the layout result data and that the content is a document.
+ *        LayoutResult result = doSomeLayoutWork();
+ *
+ *        PrintDocumentInfo info = new PrintDocumentInfo
+ *                .Builder("printed_file.pdf")
+ *                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
+ *                .setPageCount(result.getPageCount())
+ *                .build();
+ *
+ *       callback.onLayoutFinished(info, result.getContentChanged());
+ *   }
+ *
+ *   . . .
+ *
+ * </pre>
+ * </p>
  */
 public final class PrintDocumentInfo implements Parcelable {
 
     /**
-     * Constant for unknown page count..
+     * Constant for unknown page count.
      */
     public static final int PAGE_COUNT_UNKNOWN = -1;
 
@@ -37,11 +81,23 @@
 
     /**
      * Content type: document.
+     * <p>
+     * A print service may use normal paper to print the content instead
+     * of dedicated photo paper. Also it may use a lower quality printing
+     * process as the content is not as sensitive to print quality variation
+     * as a photo is.
+     * </p>
      */
     public static final int CONTENT_TYPE_DOCUMENT = 0;
 
     /**
      * Content type: photo.
+     * <p>
+     * A print service may use dedicated photo paper to print the content
+     * instead of normal paper. Also it may use a higher quality printing
+     * process as the content is more sensitive to print quality variation
+     * than a document.
+     * </p>
      */
     public static final int CONTENT_TYPE_PHOTO = 1;
 
@@ -82,7 +138,8 @@
     }
 
     /**
-     * Gets the document name.
+     * Gets the document name. This name may be shown to
+     * the user.
      *
      * @return The document name.
      */
@@ -213,20 +270,23 @@
     }
 
     /**
-     * Builder for creating an {@link PrintDocumentInfo}.
+     * Builder for creating a {@link PrintDocumentInfo}.
      */
     public static final class Builder {
         private final PrintDocumentInfo mPrototype;
 
         /**
          * 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.
+         * The values of the relevant properties are initialized with defaults.
+         * Please refer to the documentation of the individual setters for
+         * information about the default values.
          * </p>
          *
-         * @param name The document name. Cannot be empty. 
+         * @param name The document name which may be shown to the user and
+         * is the file name if the content it describes is saved as a PDF.
+         * Cannot be empty. 
          */
         public Builder(String name) {
             if (TextUtils.isEmpty(name)) {
diff --git a/core/java/android/print/PrintJob.java b/core/java/android/print/PrintJob.java
index 535ae43..0abe219 100644
--- a/core/java/android/print/PrintJob.java
+++ b/core/java/android/print/PrintJob.java
@@ -17,8 +17,13 @@
 package android.print;
 
 /**
- * This class represents a print job from the perspective of
- * an application.
+ * This class represents a print job from the perspective of an
+ * application. It contains behavior methods for performing operations
+ * on it as well as methods for querying its state. A snapshot of the
+ * print job state is represented by the {@link PrintJobInfo} class.
+ * The state of a print job may change over time. An application receives
+ * instances of this class when creating a print job or querying for
+ * its print jobs.
  */
 public final class PrintJob {
 
@@ -145,11 +150,12 @@
     /**
      * Gets whether this print job is failed. Such a print job is
      * not successfully printed due to an error. You can request
-     * a restart via {@link #restart()}.
+     * a restart via {@link #restart()} or cancel via {@link #cancel()}.
      *
      * @return Whether the print job is failed.
      *
      * @see #restart()
+     * @see #cancel()
      */
     public boolean isFailed() {
         return getInfo().getState() == PrintJobInfo.STATE_FAILED;
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index c6f0a68..c2f190d 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -22,7 +22,10 @@
 import java.util.Arrays;
 
 /**
- * This class represents the description of a print job.
+ * This class represents the description of a print job. The print job
+ * state includes properties such as its id, print attributes used for
+ * generating the content, and so on. Note that the print jobs state may
+ * change over time and this class represents a snapshot of this state.
  */
 public final class PrintJobInfo implements Parcelable {
 
@@ -93,7 +96,7 @@
     public static final int STATE_BLOCKED = 4;
 
     /**
-     * Print job state: The print job was successfully printed.
+     * Print job state: The print job is successfully printed.
      * This is a terminal state.
      * <p>
      * Next valid states: None
@@ -103,15 +106,14 @@
 
     /**
      * Print job state: The print job was printing but printing failed.
-     * This is a terminal state.
      * <p>
-     * Next valid states: None
+     * Next valid states: {@link #STATE_CANCELED}, {@link #STATE_STARTED}
      * </p>
      */
     public static final int STATE_FAILED = 6;
 
     /**
-     * Print job state: The print job was canceled.
+     * Print job state: The print job is canceled.
      * This is a terminal state.
      * <p>
      * Next valid states: None
@@ -297,6 +299,14 @@
      * Gets the current job state.
      *
      * @return The job state.
+     *
+     * @see #STATE_CREATED
+     * @see #STATE_QUEUED
+     * @see #STATE_STARTED
+     * @see #STATE_COMPLETED
+     * @see #STATE_BLOCKED
+     * @see #STATE_FAILED
+     * @see #STATE_CANCELED
      */
     public int getState() {
         return mState;
@@ -611,7 +621,7 @@
          * Constructor.
          *
          * @param prototype Prototype to use as a starting point.
-         * Can be null.
+         * Can be <code>null</code>.
          */
         public Builder(PrintJobInfo prototype) {
             mPrototype = (prototype != null)
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 955b4d8..bbfc307 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -55,6 +55,49 @@
  * PrintManager printManager =
  *         (PrintManager) context.getSystemService(Context.PRINT_SERVICE);
  * </pre>
+ * 
+ * <h3>Print mechanics</h3>
+ * <p>
+ * The key idea behind printing on the platform is that the content to be printed
+ * should be laid out for the currently selected print options resulting in an
+ * optimized output and higher user satisfaction. To achieve this goal the platform
+ * declares a contract that the printing application has to follow which is defined
+ * by the {@link PrintDocumentAdapter} class. At a higher level the contract is that
+ * when the user selects some options from the print UI that may affect the way
+ * content is laid out, for example page size, the application receives a callback
+ * allowing it to layout the content to better fit these new constraints. After a
+ * layout pass the system may ask the application to render one or more pages one
+ * or more times. For example, an application may produce a single column list for
+ * smaller page sizes and a multi-column table for larger page sizes.
+ * </p>
+ * <h3>Print jobs</h3>
+ * <p>
+ * Print jobs are started by calling the {@link #print(String, PrintDocumentAdapter,
+ * PrintAttributes)} from an activity which results in bringing up the system print
+ * UI. Once the print UI is up, when the user changes a selected print option that
+ * affects the way content is laid out the system starts to interact with the
+ * application following the mechanics described the section above.
+ * </p>
+ * <p>
+ * Print jobs can be in {@link PrintJobInfo#STATE_CREATED created}, {@link
+ * PrintJobInfo#STATE_QUEUED queued}, {@link PrintJobInfo#STATE_STARTED started},
+ * {@link PrintJobInfo#STATE_BLOCKED blocked}, {@link PrintJobInfo#STATE_COMPLETED
+ * completed}, {@link PrintJobInfo#STATE_FAILED failed}, and {@link
+ * PrintJobInfo#STATE_CANCELED canceled} state. Print jobs are stored in dedicated
+ * system spooler until they are handled which is they are cancelled or completed.
+ * Active print jobs, ones that are not cancelled or completed, are considered failed
+ * if the device reboots as the new boot may be after a very long time. The user may
+ * choose to restart such print jobs. Once a print job is queued all relevant content
+ * is stored in the system spooler and its lifecycle becomes detached from this of
+ * the application that created it.
+ * </p>
+ * <p>
+ * An applications can query the print spooler for current print jobs it created
+ * but not print jobs created by other applications.
+ * </p>
+ *
+ * @see PrintJob
+ * @see PrintJobInfo
  */
 public final class PrintManager {
 
@@ -292,20 +335,54 @@
     /**
      * Creates a print job for printing a {@link PrintDocumentAdapter} with
      * default print attributes.
-     * 
-     * @param printJobName A name for the new print job.
+     * <p>
+     * Calling this method brings the print UI allowing the user to customize
+     * the print job and returns a {@link PrintJob} object without waiting for the
+     * user to customize or confirm the print job. The returned print job instance
+     * is in a {@link PrintJobInfo#STATE_CREATED created} state.
+     * <p>
+     * This method can be called only from an {@link Activity}. The rationale is that
+     * printing from a service will create an inconsistent user experience as the print
+     * UI would appear without any context.
+     * </p>
+     * <p>
+     * Also the passed in {@link PrintDocumentAdapter} will be considered invalid if
+     * your activity is finished. The rationale is that once the activity that
+     * initiated printing is finished, the provided adapter may be in an inconsistent
+     * state as it may depend on the UI presented by the activity.
+     * </p>
+     * <p>
+     * The default print attributes are a hint to the system how the data is to
+     * be printed. For example, a photo editor may look at the photo aspect ratio
+     * to determine the default orientation and provide a hint whether the printing
+     * should be in portrait or landscape. The system will do a best effort to
+     * selected the hinted options in the print dialog, given the current printer
+     * supports them.
+     * </p>
+     *
+     * @param printJobName A name for the new print job which is shown to the user.
      * @param documentAdapter An adapter that emits the document to print.
-     * @param attributes The default print job attributes.
+     * @param attributes The default print job attributes or <code>null</code>.
      * @return The created print job on success or null on failure.
+     * @throws IllegalStateException If not called from an {@link Activity}.
+     * @throws IllegalArgumentException If the print job name is empty or the
+     * document adapter is null.
+     *
      * @see PrintJob
      */
     public PrintJob print(String printJobName, PrintDocumentAdapter documentAdapter,
             PrintAttributes attributes) {
+        if (!(mContext instanceof Activity)) {
+            throw new IllegalStateException("Can print only from an activity");
+        }
         if (TextUtils.isEmpty(printJobName)) {
-            throw new IllegalArgumentException("priintJobName cannot be empty");
+            throw new IllegalArgumentException("printJobName cannot be empty");
+        }
+        if (documentAdapter == null) {
+            throw new IllegalArgumentException("documentAdapter cannot be null");
         }
         PrintDocumentAdapterDelegate delegate = new PrintDocumentAdapterDelegate(
-                mContext, documentAdapter);
+                (Activity) mContext, documentAdapter);
         try {
             Bundle result = mService.print(printJobName, delegate,
                     attributes, mContext.getPackageName(), mAppId, mUserId);
@@ -398,12 +475,9 @@
 
         private boolean mDestroyed;
 
-        public PrintDocumentAdapterDelegate(Context context,
+        public PrintDocumentAdapterDelegate(Activity activity,
                 PrintDocumentAdapter documentAdapter) {
-            if (!(context instanceof Activity)) {
-                throw new IllegalStateException("Can print only from an activity");
-            }
-            mActivity = (Activity) context;
+            mActivity = activity;
             mDocumentAdapter = documentAdapter;
             mHandler = new MyHandler(mActivity.getMainLooper());
             mActivity.getApplication().registerActivityLifecycleCallbacks(this);
diff --git a/core/java/android/print/PrinterCapabilitiesInfo.java b/core/java/android/print/PrinterCapabilitiesInfo.java
index df51ec1..b615600 100644
--- a/core/java/android/print/PrinterCapabilitiesInfo.java
+++ b/core/java/android/print/PrinterCapabilitiesInfo.java
@@ -24,10 +24,17 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
- * This class represents the capabilities of a printer.
+ * This class represents the capabilities of a printer. Instances
+ * of this class are created by a print service to report the
+ * capabilities of a printer it manages. The capabilities of a
+ * printer specify how it can print content. For example, what
+ * are the media sizes supported by the printer, what are the
+ * minimal margins of the printer based on its technical design,
+ * etc.
  */
 public final class PrinterCapabilitiesInfo implements Parcelable {
     /**
@@ -112,7 +119,7 @@
      * @return The media sizes.
      */
     public List<MediaSize> getMediaSizes() {
-        return mMediaSizes;
+        return Collections.unmodifiableList(mMediaSizes);
     }
 
     /**
@@ -121,7 +128,7 @@
      * @return The resolutions.
      */
     public List<Resolution> getResolutions() {
-        return mResolutions;
+        return Collections.unmodifiableList(mResolutions);
     }
 
     /**
@@ -135,9 +142,9 @@
     }
 
     /**
-     * Gets the supported color modes.
+     * Gets the bit mask of supported color modes.
      *
-     * @return The color modes.
+     * @return The bit mask of supported color modes.
      *
      * @see PrintAttributes#COLOR_MODE_COLOR
      * @see PrintAttributes#COLOR_MODE_MONOCHROME
@@ -355,9 +362,10 @@
     }
 
     /**
-     * Builder for creating of a {@link PrinterInfo}. This class is responsible
-     * to enforce that all required attributes have at least one default value.
-     * In other words, this class creates only well-formed {@link PrinterInfo}s.
+     * Builder for creating of a {@link PrinterCapabilitiesInfo}. This class is
+     * responsible to enforce that all required attributes have at least one
+     * default value. In other words, this class creates only well-formed {@link
+     * PrinterCapabilitiesInfo}s.
      * <p>
      * Look at the individual methods for a reference whether a property is
      * required or if it is optional.
@@ -369,9 +377,9 @@
         /**
          * Creates a new instance.
          *
-         * @param printerId The printer id. Cannot be null.
+         * @param printerId The printer id. Cannot be <code>null</code>.
          *
-         * @throws IllegalArgumentException If the printer id is null.
+         * @throws IllegalArgumentException If the printer id is <code>null</code>.
          */
         public Builder(PrinterId printerId) {
             if (printerId == null) {
@@ -492,7 +500,7 @@
 
         /**
          * Crates a new {@link PrinterCapabilitiesInfo} enforcing that all
-         * required properties have need specified. See individual methods
+         * required properties have been specified. See individual methods
          * in this class for reference about required attributes.
          *
          * @return A new {@link PrinterCapabilitiesInfo}.
@@ -521,7 +529,7 @@
             if (mPrototype.mMinMargins == null) {
                 throw new IllegalArgumentException("margins cannot be null");
             }
-            return new PrinterCapabilitiesInfo(mPrototype);
+            return mPrototype;
         }
 
         private void throwIfDefaultAlreadySpecified(int propertyIndex) {
diff --git a/core/java/android/print/PrinterInfo.java b/core/java/android/print/PrinterInfo.java
index ad79a38..7fcc81f 100644
--- a/core/java/android/print/PrinterInfo.java
+++ b/core/java/android/print/PrinterInfo.java
@@ -21,7 +21,12 @@
 import android.text.TextUtils;
 
 /**
- * This class represents the description of a printer.
+ * This class represents the description of a printer. Instances of
+ * this class are created by print services to report to the system
+ * the printers they manage. The information of this class has two
+ * major components, printer properties such as name, id, status,
+ * description and printer capabilities which describe the various
+ * print modes a printer supports such as media sizes, margins, etc.
  */
 public final class PrinterInfo implements Parcelable {
 
@@ -96,6 +101,10 @@
      * Gets the printer status.
      *
      * @return The status.
+     *
+     * @see #STATUS_BUSY
+     * @see #STATUS_IDLE
+     * @see #STATUS_UNAVAILABLE
      */
     public int getStatus() {
         return mStatus;
@@ -216,6 +225,8 @@
          * @param printerId The printer id. Cannot be null.
          * @param name The printer name. Cannot be empty.
          * @param status The printer status. Must be a valid status.
+         * @throws IllegalArgumentException If the printer id is null, or the
+         * printer name is empty or the status is not a valid one.
          */
         public Builder(PrinterId printerId, String name, int status) {
             if (printerId == null) {
@@ -259,7 +270,8 @@
         }
 
         /**
-         * Sets the printer name.
+         * Sets the <strong>localized</strong> printer name which
+         * is shown to the user
          *
          * @param name The name.
          * @return This builder.
@@ -270,7 +282,8 @@
         }
 
         /**
-         * Sets the printer description.
+         * Sets the <strong>localized</strong> printer description
+         * which is shown to the user
          *
          * @param description The description.
          * @return This builder.
@@ -292,12 +305,12 @@
         }
 
         /**
-         * Crates a new {@link PrinterInfo}.
+         * Creates a new {@link PrinterInfo}.
          *
          * @return A new {@link PrinterInfo}.
          */
         public PrinterInfo build() {
-            return new PrinterInfo(mPrototype);
+            return mPrototype;
         }
 
         private boolean isValidStatus(int status) {
diff --git a/core/java/android/print/package.html b/core/java/android/print/package.html
new file mode 100644
index 0000000..579567d
--- /dev/null
+++ b/core/java/android/print/package.html
@@ -0,0 +1,46 @@
+<HTML>
+<BODY>
+<h3>Overview</h3>
+<p>
+Provides classes for implementing print support in applications and also contains all
+base classes and abstractions involved in printing. These base classes are also used
+by other more specialized printing related packages.
+</p>
+<p>
+The entry point for interacting with the print system is the {@link android.print.PrintManager}
+which is a system service that can be obtained from the current context. The print manager
+provides APIs for printing, querying the state of print jobs, etc.
+<p/>
+<h3>Print contract</h3>
+<p>
+An application that wants to implement printing must extend
+{@link android.print.PrintDocumentAdapter} which defines the contract between the system
+and the application.The key idea behind this adapter is that the printed content may change
+based on the selected print options, such as media size, orientation, which
+requires the content to be re-laid out. The constraints according to which the content has
+to be laid out are encapsulated in the {@link android.print.PrintAttributes} class. Once
+layout is completed the application calls back to the system passing a
+{@link android.print.PrintDocumentInfo} instance which describes the generated content. After
+the content has been laid out the application may be asked to render some pages of that content
+for preview or printing. The range of pages that have to be rendered is abstracted by the
+{@link android.print.PageRange} class.
+</p>
+<h3>Print jobs</h3>
+<p>
+A print job is represented by the {@link android.print.PrintJob} class which has behavior
+methods as well as methods for querying its state. Each print job has a unique id represented
+by the {@link android.print.PrintJobId} class and exposes APIs for obtaining a {@link
+android.print.PrintJobInfo} which is a snapshot of its state. The print job state may
+change over time.
+</p>
+<h3>Printers</h3>
+<p>
+An available printer represented by the {@link android.print.PrinterInfo} class has a
+unique id which is abstracted by the {@link android.print.PrinterId} class. The {@link
+android.print.PrinterInfo} contains printer properties such as id, name, description, status,
+and printer capabilities encapsulated in the {@link android.print.PrinterCapabilitiesInfo}
+class. Printer capabilities describe how a printer can print content, for example what are
+the supported media sizes, color modes, resolutions, etc.
+<p>
+</BODY>
+</HTML>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 787b59a..db3770e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -621,7 +621,7 @@
                         .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY);
                 Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
                 intent.setType("application/pdf");
-                intent.putExtra(Intent.EXTRA_TITLE, printJob.getLabel());
+                intent.putExtra(Intent.EXTRA_TITLE, mDocument.info.getName());
                 intent.putExtra(DocumentsContract.EXTRA_PACKAGE_NAME, mCallingPackageName);
                 startActivityForResult(intent, ACTIVITY_REQUEST_CREATE_FILE);
             } else {