Merge "Sometimes write may be called twice in a row for the same content."
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index c1c7a4e..e560d6e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -454,7 +454,11 @@
                 return;
             }
 
-            mControllerState = CONTROLLER_STATE_LAYOUT_COMPLETED;
+            final int oldControllerState = mControllerState;
+
+            if (mControllerState == CONTROLLER_STATE_LAYOUT_STARTED) {
+                mControllerState = CONTROLLER_STATE_LAYOUT_COMPLETED;
+            }
 
             // For layout purposes we care only whether the type or the page
             // count changed. We still do not have the size since we did not
@@ -477,6 +481,8 @@
                         mPrintJobId, null);
             }
 
+            PageRange[] oldRequestedPages = mRequestedPages;
+
             // No pages means that the user selected an invalid range while we
             // were doing a layout or the layout returned a document info for
             // which the selected range is invalid. In such a case we do not
@@ -504,14 +510,21 @@
                 }
             }
 
-            // If the info and the layout did not change and we already have
-            // the requested pages, then nothing else to do.
+            // If the info and the layout did not change...
             if (!infoChanged && !layoutChanged
-                    && PageRangeUtils.contains(mDocument.pages, mRequestedPages)) {
+                    // and we have the requested pages ... 
+                    && (PageRangeUtils.contains(mDocument.pages, mRequestedPages))
+                        // ...or the requested pages are being written...
+                        || (oldControllerState == CONTROLLER_STATE_WRITE_STARTED
+                            && oldRequestedPages != null
+                            && PageRangeUtils.contains(oldRequestedPages, mRequestedPages))) {
                 // Nothing interesting changed and we have all requested pages.
                 // Then update the print jobs's pages as we will not do a write
                 // and we usually update the pages in the write complete callback.
-                updatePrintJobPages(mDocument.pages, mRequestedPages);
+                if (mDocument.pages != null) {
+                    // Update the print job's pages given we have them.
+                    updatePrintJobPages(mDocument.pages, mRequestedPages);
+                }
                 mEditor.updateUi();
                 if (mEditor.isDone()) {
                     requestCreatePdfFileOrFinish();
@@ -616,7 +629,9 @@
                 // We did not get the pages we requested, then the application
                 // misbehaves, so we fail quickly.
                 mControllerState = CONTROLLER_STATE_FAILED;
-                Log.e(LOG_TAG, "Received invalid pages from the app");
+                Log.e(LOG_TAG, "Received invalid pages from the app: requested="
+                        + Arrays.toString(requestedPages) + " written="
+                        + Arrays.toString(writtenPages));
                 mEditor.showUi(Editor.UI_ERROR, null);
             }
         }
@@ -1276,7 +1291,7 @@
                     // Initially, we have only safe to PDF as a printer but after some
                     // printers are loaded we want to select the user's favorite one
                     // which is the first.
-                    if (!mFavoritePrinterSelected && mDestinationSpinnerAdapter.getCount() > 2) {
+                    if (!mFavoritePrinterSelected && mDestinationSpinnerAdapter.getCount() > 1) {
                         mFavoritePrinterSelected = true;
                         mDestinationSpinner.setSelection(0);
                         // Workaround again the weird spinner behavior to notify for selection
@@ -1350,6 +1365,7 @@
 
                                 if (mCurrentPrinter.getCapabilities() == null) {
                                     if (printer.getCapabilities() != null) {
+                                        updatePrintAttributes(printer.getCapabilities());
                                         capabilitiesChanged = true;
                                     }
                                 } else if (!mCurrentPrinter.getCapabilities().equals(