Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5559c368 authored by Svetoslav's avatar Svetoslav
Browse files

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
parent 5006eb75
Loading
Loading
Loading
Loading
+33 −4
Original line number Diff line number Diff line
@@ -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;