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