Clean up of the print APIs.

1. Fixed a case in which the onPrintCompleted callback may not be invoked.

2. Added string resulrces for the different error messages for failed
   printing in OnPrintCompletedCallback

3. Fixed the string comments for the MediaSize constants.

4. Added APIs to create certain print attributes by passing in a
   string label instead of resource and package name since in some cases
   a print service may be getting already internationalized lables
   or it may not know all possible values.

5. Fixed a crash in PrintJobConfigActivity if there is no input or
   output tray.

Change-Id: Ie877b7dc669051606394aa290e6d2b979a42db4c
diff --git a/api/current.txt b/api/current.txt
index ca6dff9..e0025ea 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -18498,54 +18498,55 @@
   }
 
   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.CharSequence, int, int);
+    method public static android.print.PrintAttributes.MediaSize createMediaSize(android.content.pm.PackageManager, int);
     method public int getHeightMils();
     method public java.lang.String getId();
-    method public java.lang.CharSequence getLabel(android.content.pm.PackageManager);
+    method public java.lang.CharSequence getLabel();
     method public int getWidthMils();
-    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;
+    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
   }
 
   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.CharSequence, int, int);
     method public int getHorizontalDpi();
     method public java.lang.String getId();
     method public java.lang.CharSequence getLabel(android.content.pm.PackageManager);
@@ -18553,7 +18554,7 @@
   }
 
   public static final class PrintAttributes.Tray {
-    ctor public PrintAttributes.Tray(java.lang.String, java.lang.String, int);
+    ctor public PrintAttributes.Tray(java.lang.String, java.lang.CharSequence);
     method public java.lang.String getId();
     method public java.lang.CharSequence getLabel(android.content.pm.PackageManager);
   }
diff --git a/core/java/android/print/FileDocumentAdapter.java b/core/java/android/print/FileDocumentAdapter.java
index d162c19..2871d45 100644
--- a/core/java/android/print/FileDocumentAdapter.java
+++ b/core/java/android/print/FileDocumentAdapter.java
@@ -16,11 +16,14 @@
 
 package android.print;
 
+import android.content.Context;
 import android.os.AsyncTask;
 import android.os.CancellationSignal;
 import android.os.CancellationSignal.OnCancelListener;
 import android.util.Log;
 
+import com.android.internal.R;
+
 import libcore.io.IoUtils;
 
 import java.io.File;
@@ -40,14 +43,17 @@
 
     private static final String LOG_TAG = "FileDocumentAdapter";
 
+    private final Context mContext;
+
     private final File mFile;
 
     private WriteFileAsyncTask mWriteFileAsyncTask;
 
-    public FileDocumentAdapter(File file) {
+    public FileDocumentAdapter(Context context, File file) {
         if (file == null) {
             throw new IllegalArgumentException("File cannot be null!");
         }
+        mContext = context;
         mFile = file;
     }
 
@@ -63,16 +69,12 @@
     @Override
     public void onWrite(List<PageRange> pages, FileDescriptor destination,
             CancellationSignal cancellationSignal, WriteResultCallback callback) {
-        mWriteFileAsyncTask = new WriteFileAsyncTask(mFile, destination, cancellationSignal,
-                callback);
+        mWriteFileAsyncTask = new WriteFileAsyncTask(destination, cancellationSignal, callback);
         mWriteFileAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
                 (Void[]) null);
-        
     }
 
-    private static final class WriteFileAsyncTask extends AsyncTask<Void, Void, Void> {
-
-        private final File mSource;
+    private final class WriteFileAsyncTask extends AsyncTask<Void, Void, Void> {
 
         private final FileDescriptor mDestination;
 
@@ -80,12 +82,11 @@
 
         private final CancellationSignal mCancellationSignal;
 
-        public WriteFileAsyncTask(File source, FileDescriptor destination,
+        public WriteFileAsyncTask(FileDescriptor destination,
                 CancellationSignal cancellationSignal, WriteResultCallback callback) {
-            mSource = source;
             mDestination = destination;
             mResultCallback = callback;
-            mCancellationSignal = cancellationSignal; 
+            mCancellationSignal = cancellationSignal;
             mCancellationSignal.setOnCancelListener(new OnCancelListener() {
                 @Override
                 public void onCancel() {
@@ -100,8 +101,11 @@
             OutputStream out = new FileOutputStream(mDestination);
             final byte[] buffer = new byte[8192];
             try {
-                in = new FileInputStream(mSource);
+                in = new FileInputStream(mFile);
                 while (true) {
+                    if (isCancelled()) {
+                        break;
+                    }
                     final int readByteCount = in.read(buffer);
                     if (readByteCount < 0) {
                         break;
@@ -109,20 +113,28 @@
                     out.write(buffer, 0, readByteCount);
                 }
              } catch (IOException ioe) {
-                Log.e(LOG_TAG, "Error writing data!", ioe);
+                 Log.e(LOG_TAG, "Error writing data!", ioe);
+                 mResultCallback.onWriteFailed(mContext.getString(
+                         R.string.write_fail_reason_cannot_write));
              } finally {
                 IoUtils.closeQuietly(in);
                 IoUtils.closeQuietly(out);
-                if (!isCancelled()) {
-                    List<PageRange> pages = new ArrayList<PageRange>();
-                    pages.add(PageRange.ALL_PAGES);
-                    mResultCallback.onWriteFinished(pages);
-                } else {
-                    mResultCallback.onWriteFailed("Cancelled");
-                }
             }
             return null;
         }
+
+        @Override
+        protected void onPostExecute(Void result) {
+            List<PageRange> pages = new ArrayList<PageRange>();
+            pages.add(PageRange.ALL_PAGES);
+            mResultCallback.onWriteFinished(pages);
+        }
+
+        @Override
+        protected void onCancelled(Void result) {
+            mResultCallback.onWriteFailed(mContext.getString(
+                    R.string.write_fail_reason_cancelled));
+        }
     }
 }
 
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index 8511d0b..2a27a32 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -18,11 +18,10 @@
 
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources.NotFoundException;
+import android.content.res.Resources;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
-import android.util.Log;
 
 import com.android.internal.R;
 
@@ -388,145 +387,506 @@
      * 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") */
-        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 A0 media size: 841mm x 1189mm (33.11" x 46.81")
+         *
+         * @see #createMediaSize(PackageManager, int)
+         */
+        public static final int ISO_A0 = 1;
 
-        /** 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 A1 media size: 594mm x 841mm (23.39" x 33.11")
+         *
+         * @see #createMediaSize(PackageManager, int)
+         */
+        public static final int ISO_A1 = 2;
 
-        /** 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);
+        /**
+         *
+         *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" */
-        public static final MediaSize NA_LETTER =
-                new MediaSize("NA_LETTER", "android", R.string.mediaSize_na_letter, 8500, 11000);
-        /** North America Government-Letter media size: 8.0" x 10.5" */
-        public static final MediaSize NA_GOVT_LETTER =
-                new MediaSize("NA_GOVT_LETTER", "android",
-                        R.string.mediaSize_na_gvrnmt_letter, 8000, 10500);
-        /** North America Legal media size: 8.5" x 14" */
-        public static final MediaSize NA_LEGAL =
-                new MediaSize("NA_LEGAL", "android", R.string.mediaSize_na_legal, 8500, 14000);
-        /** North America Junior Legal media size: 8.0" x 5.0" */
-        public static final MediaSize NA_JUNIOR_LEGAL =
-                new MediaSize("NA_JUNIOR_LEGAL", "android",
-                        R.string.mediaSize_na_junior_legal, 8000, 5000);
-        /** North America Ledger media size: 17" x 11" */
-        public static final MediaSize NA_LEDGER =
-                new MediaSize("NA_LEDGER", "android", R.string.mediaSize_na_ledger, 17000, 11000);
-        /** North America Tabloid media size: 11" x 17" */
-        public static final MediaSize NA_TBLOID =
-                new MediaSize("NA_TABLOID", "android",
-                        R.string.mediaSize_na_tabloid, 11000, 17000);
+        /**
+         * North America 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;
+
+        /**
+         * 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.");
+                }
+            }
+        }
 
         private final String mId;
-        private final String mPackageName;
-        private final int mLabelResId;
+        private final CharSequence mLabel;
         private final int mWidthMils;
         private final int mHeightMils;
 
         /**
+         * Creates a new instance.
+         *
+         * @param id The unique media size id.
+         * @param label The <strong>internationalized</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.
+         */
+        public MediaSize(String id, CharSequence label, int widthMils, int heightMils) {
+            if (TextUtils.isEmpty(id)) {
+                throw new IllegalArgumentException("id cannot be empty.");
+            }
+            if (TextUtils.isEmpty(label)) {
+                throw new IllegalArgumentException("label cannot be empty.");
+            }
+            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.");
+            }
+            mId = id;
+            mLabel = label;
+            mWidthMils = widthMils;
+            mHeightMils = heightMils;
+        }
+
+        /**
          * Gets the unique media size id.
          *
          * @return The unique media size id.
@@ -540,18 +900,8 @@
          *
          * @return The human readable label.
          */
-        public CharSequence getLabel(PackageManager packageManager) {
-            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 null;
+        public CharSequence getLabel() {
+            return mLabel;
         }
 
         /**
@@ -572,50 +922,9 @@
             return mHeightMils;
         }
 
-        /**
-         * Creates a new instance.
-         *
-         * @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;
-        }
-
         void writeToParcel(Parcel parcel) {
             parcel.writeString(mId);
-            parcel.writeString(mPackageName);
-            parcel.writeInt(mLabelResId);
+            parcel.writeCharSequence(mLabel);
             parcel.writeInt(mWidthMils);
             parcel.writeInt(mHeightMils);
         }
@@ -623,8 +932,7 @@
         static MediaSize createFromParcel(Parcel parcel) {
             return new MediaSize(
                     parcel.readString(),
-                    parcel.readString(),
-                    parcel.readInt(),
+                    parcel.readCharSequence(),
                     parcel.readInt(),
                     parcel.readInt());
         }
@@ -634,8 +942,7 @@
             StringBuilder builder = new StringBuilder();
             builder.append("MediaSize{");
             builder.append("id: ").append(mId);
-            builder.append(", packageName: ").append(mPackageName);
-            builder.append(", labelResId: ").append(mLabelResId);
+            builder.append(", label: ").append(mLabel);
             builder.append(", heightMils: ").append(mHeightMils);
             builder.append(", widthMils: ").append(mWidthMils);
             builder.append("}");
@@ -647,15 +954,46 @@
      * 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 mPackageName;
-        private final int mLabelResId;
+        private final CharSequence mLabel;
         private final int mHorizontalDpi;
         private final int mVerticalDpi;
 
         /**
+         * Creates a new instance.
+         *
+         * @param id The unique resolution id.
+         * @param label The <strong>internationalized</strong> 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, CharSequence label, int horizontalDpi, int verticalDpi) {
+            if (TextUtils.isEmpty(id)) {
+                throw new IllegalArgumentException("id cannot be empty.");
+            }
+            if (TextUtils.isEmpty(label)) {
+                throw new IllegalArgumentException("label cannot be empty.");
+            }
+            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;
+            mLabel = label;
+            mHorizontalDpi = horizontalDpi;
+            mVerticalDpi = verticalDpi;
+        }
+
+        /**
          * Gets the unique resolution id.
          *
          * @return The unique resolution id.
@@ -670,17 +1008,7 @@
          * @return The human readable label.
          */
         public CharSequence getLabel(PackageManager packageManager) {
-            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 null;
+            return mLabel;
         }
 
         /**
@@ -701,50 +1029,9 @@
             return mVerticalDpi;
         }
 
-        /**
-         * Creates a new instance.
-         *
-         * @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;
-        }
-
         void writeToParcel(Parcel parcel) {
             parcel.writeString(mId);
-            parcel.writeString(mPackageName);
-            parcel.writeInt(mLabelResId);
+            parcel.writeCharSequence(mLabel);
             parcel.writeInt(mHorizontalDpi);
             parcel.writeInt(mVerticalDpi);
         }
@@ -752,8 +1039,7 @@
         static Resolution createFromParcel(Parcel parcel) {
             return new Resolution(
                     parcel.readString(),
-                    parcel.readString(),
-                    parcel.readInt(),
+                    parcel.readCharSequence(),
                     parcel.readInt(),
                     parcel.readInt());
         }
@@ -763,8 +1049,7 @@
             StringBuilder builder = new StringBuilder();
             builder.append("Resolution{");
             builder.append("id: ").append(mId);
-            builder.append(", packageName: ").append(mPackageName);
-            builder.append(", labelResId: ").append(mLabelResId);
+            builder.append(", label: ").append(mLabel);
             builder.append(", horizontalDpi: ").append(mHorizontalDpi);
             builder.append(", verticalDpi: ").append(mVerticalDpi);
             builder.append("}");
@@ -782,6 +1067,38 @@
         private final int mBottomMils;
 
         /**
+         * Creates a new instance.
+         *
+         * @param leftMils The left margin in mils (thousands of an inch).
+         * @param topMils The top margin in mils (thousands of an inch).
+         * @param rightMils The right margin in mils (thousands of an inch).
+         * @param bottomMils The bottom margin in mils (thousands of an inch).
+         *
+         * @throws IllegalArgumentException If the leftMils is less than zero.
+         * @throws IllegalArgumentException If the topMils is less than zero.
+         * @throws IllegalArgumentException If the rightMils is less than zero.
+         * @throws IllegalArgumentException If the bottomMils is less than zero.
+         */
+        public Margins(int leftMils, int topMils, int rightMils, int bottomMils) {
+            if (leftMils < 0) {
+                throw new IllegalArgumentException("leftMils cannot be less than zero.");
+            }
+            if (topMils < 0) {
+                throw new IllegalArgumentException("topMils cannot be less than zero.");
+            }
+            if (rightMils < 0) {
+                throw new IllegalArgumentException("rightMils cannot be less than zero.");
+            }
+            if (bottomMils < 0) {
+                throw new IllegalArgumentException("bottomMils cannot be less than zero.");
+            }
+            mTopMils = topMils;
+            mLeftMils = leftMils;
+            mRightMils = rightMils;
+            mBottomMils = bottomMils;
+        }
+
+        /**
          * Gets the left margin in mils (thousands of an inch).
          *
          * @return The left margin.
@@ -817,38 +1134,6 @@
             return mBottomMils;
         }
 
-        /**
-         * Creates a new instance.
-         *
-         * @param leftMils The left margin in mils (thousands of an inch).
-         * @param topMils The top margin in mils (thousands of an inch).
-         * @param rightMils The right margin in mils (thousands of an inch).
-         * @param bottomMils The bottom margin in mils (thousands of an inch).
-         *
-         * @throws IllegalArgumentException If the leftMils is less than zero.
-         * @throws IllegalArgumentException If the topMils is less than zero.
-         * @throws IllegalArgumentException If the rightMils is less than zero.
-         * @throws IllegalArgumentException If the bottomMils is less than zero.
-         */
-        public Margins(int leftMils, int topMils, int rightMils, int bottomMils) {
-            if (leftMils < 0) {
-                throw new IllegalArgumentException("leftMils cannot be less than zero.");
-            }
-            if (topMils < 0) {
-                throw new IllegalArgumentException("topMils cannot be less than zero.");
-            }
-            if (rightMils < 0) {
-                throw new IllegalArgumentException("rightMils cannot be less than zero.");
-            }
-            if (bottomMils < 0) {
-                throw new IllegalArgumentException("bottomMils cannot be less than zero.");
-            }
-            mTopMils = topMils;
-            mLeftMils = leftMils;
-            mRightMils = rightMils;
-            mBottomMils = bottomMils;
-        }
-
         void writeToParcel(Parcel parcel) {
             parcel.writeInt(mLeftMils);
             parcel.writeInt(mTopMils);
@@ -881,11 +1166,28 @@
      * Represents a printer tray.
      */
     public static final class Tray {
-        private static final String LOG_TAG = "Tray";
-
         private final String mId;
-        private final String mPackageName;
-        private final int mLabelResId;
+        private final CharSequence 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, CharSequence 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.
@@ -902,55 +1204,18 @@
          * @return The human readable label.
          */
         public CharSequence getLabel(PackageManager packageManager) {
-            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 null;
-        }
-
-        /**
-         * Creates a new instance.
-         *
-         * @param id The unique tray id.
-         * @param packageName The name of the creating package.
-         * @param labelResId The resource id of a human readable label.
-         *
-         * @throws IllegalArgumentException If the id is empty.
-         * @throws IllegalArgumentException If the label is empty.
-         */
-        public Tray(String id, String packageName, int labelResId) {
-            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("label must be greater than zero.");
-            }
-            mId = id;
-            mPackageName = packageName;
-            mLabelResId = labelResId;
+            return mLabel;
         }
 
         void writeToParcel(Parcel parcel) {
             parcel.writeString(mId);
-            parcel.writeString(mPackageName);
-            parcel.writeInt(mLabelResId);
+            parcel.writeCharSequence(mLabel);
         }
 
         static Tray createFromParcel(Parcel parcel) {
             return new Tray(
                     parcel.readString(),
-                    parcel.readString(),
-                    parcel.readInt());
+                    parcel.readCharSequence());
         }
 
         @Override
@@ -959,8 +1224,7 @@
             builder.append("Tray{");
             builder.append("id: ").append(mId);
             builder.append("id: ").append(mId);
-            builder.append(", packageName: ").append(mPackageName);
-            builder.append(", labelResId: ").append(mLabelResId);
+            builder.append(", label: ").append(mLabel);
             builder.append("}");
             return builder.toString();
         }
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 8913daa..5ca19d4 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -166,7 +166,7 @@
      * @see PrintJob
      */
     public PrintJob print(String printJobName, File pdfFile, PrintAttributes attributes) {
-        FileDocumentAdapter documentAdapter = new FileDocumentAdapter(pdfFile);
+        FileDocumentAdapter documentAdapter = new FileDocumentAdapter(mContext, pdfFile);
         return print(printJobName, documentAdapter, attributes);
     }
 
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 900f28a..eba3f42 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4251,6 +4251,11 @@
     <!-- North America Tabloid media (paper) size: 11" × 17" -->
     <string name="mediaSize_na_tabloid">Tabloid</string>
 
+    <!-- Write fail reason: printing was cancelled.[CHAR LIMIT=none] -->
+    <string name="write_fail_reason_cancelled">Cancelled</string>
+    <!-- Write fail reason: couldn't write the printed content. [CHAR LIMIT=none] -->
+    <string name="write_fail_reason_cannot_write">Error writing content</string>
+
     <!-- PIN creation dialog message [CHAR LIMIT=none] -->
     <string name="restr_pin_create_pin">Create a PIN for modifying restrictions</string>
     <!-- PIN entry dialog label for PIN [CHAR LIMIT=none] -->
@@ -4267,4 +4272,5 @@
         <item quantity="one">Incorrect PIN. Try again in 1 second.</item>
         <item quantity="other">Incorrect PIN. Try again in <xliff:g id="count">%d</xliff:g> seconds.</item>
     </plurals>
+
 </resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index b58fcfc..e29e82b 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -907,6 +907,8 @@
   <java-symbol type="string" name="mediaSize_na_ledger" />
   <java-symbol type="string" name="mediaSize_na_tabloid" />
   <java-symbol type="string" name="restr_pin_enter_pin" />
+  <java-symbol type="string" name="write_fail_reason_cancelled" />
+  <java-symbol type="string" name="write_fail_reason_cannot_write" />
 
   <java-symbol type="plurals" name="abbrev_in_num_days" />
   <java-symbol type="plurals" name="abbrev_in_num_hours" />
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 7d07c05..659102c 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -356,7 +356,7 @@
         for (int i = 0; i < mediaSizeCount; i++) {
             MediaSize mediaSize = mediaSizes.get(i);
             mMediaSizeSpinnerAdapter.add(new SpinnerItem<MediaSize>(
-                    mediaSize, mediaSize.getLabel(getPackageManager())));
+                    mediaSize, mediaSize.getLabel()));
         }
         final int selectedMediaSizeIndex = mediaSizes.indexOf(
                 mPrintAttributes.getMediaSize());
@@ -393,28 +393,32 @@
         // Input tray.
         mInputTraySpinnerAdapter.clear();
         List<Tray> inputTrays = printer.getInputTrays();
-        final int inputTrayCount = inputTrays.size();
-        for (int i = 0; i < inputTrayCount; i++) {
-            Tray inputTray = inputTrays.get(i);
-            mInputTraySpinnerAdapter.add(new SpinnerItem<Tray>(
-                    inputTray, inputTray.getLabel(getPackageManager())));
+        if (inputTrays != null) {
+            final int inputTrayCount = inputTrays.size();
+            for (int i = 0; i < inputTrayCount; i++) {
+                Tray inputTray = inputTrays.get(i);
+                mInputTraySpinnerAdapter.add(new SpinnerItem<Tray>(
+                        inputTray, inputTray.getLabel(getPackageManager())));
+            }
+            final int selectedInputTrayIndex = inputTrays.indexOf(
+                    mPrintAttributes.getInputTray());
+            mInputTraySpinner.setSelection(selectedInputTrayIndex);
         }
-        final int selectedInputTrayIndex = inputTrays.indexOf(
-                mPrintAttributes.getInputTray());
-        mInputTraySpinner.setSelection(selectedInputTrayIndex);
 
         // Output tray.
         mOutputTraySpinnerAdapter.clear();
         List<Tray> outputTrays = printer.getOutputTrays();
-        final int outputTrayCount = outputTrays.size();
-        for (int i = 0; i < outputTrayCount; i++) {
-            Tray outputTray = outputTrays.get(i);
-            mOutputTraySpinnerAdapter.add(new SpinnerItem<Tray>(
-                    outputTray, outputTray.getLabel(getPackageManager())));
+        if (outputTrays != null) {
+            final int outputTrayCount = outputTrays.size();
+            for (int i = 0; i < outputTrayCount; i++) {
+                Tray outputTray = outputTrays.get(i);
+                mOutputTraySpinnerAdapter.add(new SpinnerItem<Tray>(
+                        outputTray, outputTray.getLabel(getPackageManager())));
+            }
+            final int selectedOutputTrayIndex = outputTrays.indexOf(
+                    mPrintAttributes.getOutputTray());
+            mOutputTraySpinner.setSelection(selectedOutputTrayIndex);
         }
-        final int selectedOutputTrayIndex = outputTrays.indexOf(
-                mPrintAttributes.getOutputTray());
-        mOutputTraySpinner.setSelection(selectedOutputTrayIndex);
 
         // Duplex mode.
         final int duplexModes = printer.getDuplexModes();