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