1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.android_webview;
6
7import android.os.Bundle;
8import android.os.CancellationSignal;
9import android.os.ParcelFileDescriptor;
10import android.print.PageRange;
11import android.print.PrintAttributes;
12import android.print.PrintDocumentAdapter;
13import android.print.PrintDocumentInfo;
14import android.webkit.ValueCallback;
15
16
17/**
18 * Adapter for printing Webview. This class implements the abstract
19 * system class PrintDocumentAdapter and hides all printing details from
20 * the developer.
21 */
22public class AwPrintDocumentAdapter extends PrintDocumentAdapter {
23
24    private AwPdfExporter mPdfExporter;
25    private PrintAttributes mAttributes;
26    private String mDocumentName;
27
28    /**
29     * Constructor.
30     * TODO(sgurun) remove in favor of constructor below once the AOSP changes are in.
31     *
32     * @param pdfExporter The PDF exporter to export the webview contents to a PDF file.
33     */
34    public AwPrintDocumentAdapter(AwPdfExporter pdfExporter) {
35        this(pdfExporter, "default");
36    }
37
38    /**
39     * Constructor.
40     *
41     * @param pdfExporter The PDF exporter to export the webview contents to a PDF file.
42     * @param documentName  The name of the pdf document.
43     */
44    public AwPrintDocumentAdapter(AwPdfExporter pdfExporter, String documentName) {
45        mPdfExporter = pdfExporter;
46        mDocumentName = documentName;
47    }
48
49
50    @Override
51    public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
52            CancellationSignal cancellationSignal, LayoutResultCallback callback,
53            Bundle metadata) {
54        mAttributes = newAttributes;
55        PrintDocumentInfo documentInfo = new PrintDocumentInfo
56                .Builder(mDocumentName)
57                .build();
58        // TODO(sgurun) once componentization is done, do layout changes and
59        // generate PDF here, set the page range information to documentinfo
60        // and call onLayoutFinished with true/false depending on whether
61        // layout actually changed.
62        callback.onLayoutFinished(documentInfo, true);
63    }
64
65    @Override
66    public void onWrite(PageRange[] pages, ParcelFileDescriptor destination,
67            CancellationSignal cancellationSignal, final WriteResultCallback callback) {
68        mPdfExporter.exportToPdf(destination, mAttributes, new ValueCallback<Boolean>() {
69            @Override
70            public void onReceiveValue(Boolean value) {
71                if (value) {
72                    callback.onWriteFinished(new PageRange[] { PageRange.ALL_PAGES });
73                } else {
74                    // TODO(sgurun) provide a localized error message
75                    callback.onWriteFailed(null);
76                }
77            }
78        }, cancellationSignal);
79    }
80}
81
82