diff options
author | Svetoslav <svetoslavganov@google.com> | 2013-09-20 11:58:55 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2013-09-20 12:15:22 -0700 |
commit | 5559c368a96c56d55c581c88d9978c59c5212bf1 (patch) | |
tree | 330fec8337554c2d00a7bfb7cced7b6588fcd294 /packages | |
parent | 5006eb75e6d42ac107734fa8134a726158d768d8 (diff) | |
download | frameworks_base-5559c368a96c56d55c581c88d9978c59c5212bf1.zip frameworks_base-5559c368a96c56d55c581c88d9978c59c5212bf1.tar.gz frameworks_base-5559c368a96c56d55c581c88d9978c59c5212bf1.tar.bz2 |
PrintDocumentAdapter contract not followed on print.
1. Layout was not called after pressing the print button if the
print attributes did not change. This is not correct since the
previous layout calls were for preview purposes and the one
after pressing print is not for preview. Hence, we always have
to do this layout.
2. After layout we decide whether to ask the app to write some
pages. We ask for a write if we do not have the pages selected
by the user or the document changed (if the page count changed,
the document type changed, or the app told us that the content
changed). We were not computing correctly whether the document
changed since we compared the size but the document info the
app passes in after a layout does not have the size yet. We set
the size after a write. So for layout purposes we should ignore
the size. We only care if the page count, document type, or
content changed where the latter is reported by the app in
the layout callback.
3. We were not updating the PrintJob after setting the data
size of the printed document.
4. Disabled debugging.
bug:10835370
Change-Id: Ic3b2871b4e954cdf610f8cf806de5fc6588a6bec
Diffstat (limited to 'packages')
-rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index af1c60e..bcef79c 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -29,7 +29,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -102,7 +101,7 @@ public class PrintJobConfigActivity extends Activity { private static final String LOG_TAG = "PrintJobConfigActivity"; - private static final boolean DEBUG = true && Build.IS_DEBUGGABLE; + private static final boolean DEBUG = false; public static final String EXTRA_PRINT_DOCUMENT_ADAPTER = "printDocumentAdapter"; public static final String EXTRA_PRINT_JOB = "printJob"; @@ -344,7 +343,9 @@ public class PrintJobConfigActivity extends Activity { if (!mController.hasStarted()) { mController.start(); } - if (!printAttributesChanged()) { + // If print is confirmed we always do a layout since the previous + // ones were for preview and this one is for printing. + if (!printAttributesChanged() && !mEditor.isPrintConfirmed()) { if (mDocument.info == null) { // We are waiting for the result of a layout, so do nothing. return; @@ -391,8 +392,12 @@ public class PrintJobConfigActivity extends Activity { 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 + // call write. We use "layoutChanged" set by the application to + // know whether something else changed about the document. + final boolean infoChanged = !equalsIgnoreSize(info, mDocument.info); // If the info changed, we update the document and the print job. - final boolean infoChanged = !info.equals(mDocument.info); if (infoChanged) { mDocument.info = info; // Set the info. @@ -482,6 +487,10 @@ public class PrintJobConfigActivity extends Activity { .generateFileForPrintJob(mPrintJobId); mDocument.info.setDataSize(file.length()); + // Update the print job with the updated info. + PrintSpoolerService.peekInstance().setPrintJobPrintDocumentInfoNoPersistence( + mPrintJobId, mDocument.info); + // Update which pages we have fetched. mDocument.pages = PageRangeUtils.normalize(pages); @@ -556,6 +565,26 @@ public class PrintJobConfigActivity extends Activity { PrintJobConfigActivity.this.finish(); } + private boolean equalsIgnoreSize(PrintDocumentInfo lhs, PrintDocumentInfo rhs) { + if (lhs == rhs) { + return true; + } + if (lhs == null) { + if (rhs != null) { + return false; + } + } else { + if (rhs == null) { + return false; + } + if (lhs.getContentType() != rhs.getContentType() + || lhs.getPageCount() != rhs.getPageCount()) { + return false; + } + } + return true; + } + private final class ControllerHandler extends Handler { public static final int MSG_ON_LAYOUT_FINISHED = 1; public static final int MSG_ON_LAYOUT_FAILED = 2; |