Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1524)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java

Issue 54963005: Upstream printing changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address code review Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java
diff --git a/android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java b/android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecb2c8ad81e451790ca7e049b48f34abda847985
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java
@@ -0,0 +1,113 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.print.PageRange;
+import android.print.PrintAttributes;
+import android.print.PrintDocumentAdapter;
+import android.print.PrintDocumentInfo;
+
+import android.util.Log;
+
+import android.webkit.ValueCallback;
+
+
+/**
+ * Adapter for printing Webview. This class implements the abstract
+ * system class PrintDocumentAdapter and hides all printing details from
+ * the developer.
+ */
+public class AwPrintDocumentAdapter extends PrintDocumentAdapter {
+
+ private static final String TAG = "AwPrintDocumentAdapter";
+
+ private AwPdfExporter mPdfExporter;
+ private PrintAttributes mAttributes;
+
+ /**
+ * Constructor.
+ *
+ * @param pdfExporter The PDF exporter to export the webview contents to a PDF file.
+ */
+ public AwPrintDocumentAdapter(AwPdfExporter pdfExporter) {
+ mPdfExporter = pdfExporter;
+ }
+
+ @Override
+ public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
+ CancellationSignal cancellationSignal, LayoutResultCallback callback,
+ Bundle metadata) {
+ mAttributes = newAttributes;
+ // TODO(sgurun) pass a meaningful string once b/10705082 is resolved
+ PrintDocumentInfo documentInfo = new PrintDocumentInfo
+ .Builder("webview")
+ .build();
+ // TODO(sgurun) once componentization is done, do layout changes and
+ // generate PDF here, set the page range information to documentinfo
+ // and call onLayoutFinished with true/false depending on whether
+ // layout actually changed.
+ callback.onLayoutFinished(documentInfo, true);
+ }
+
+ @Override
+ public void onWrite(PageRange[] pages, ParcelFileDescriptor destination,
+ CancellationSignal cancellationSignal, WriteResultCallback callback) {
+ // TODO(sgurun) sometimes we receive spurious onWrite. ignore it.
+ if (mAttributes.getMediaSize() == null) {
+ throw new IllegalArgumentException("attributes must specify a media size");
+ }
+ if (mAttributes.getResolution() == null) {
+ throw new IllegalArgumentException("attributes must specify print resolution");
+ }
+ if (mAttributes.getMinMargins() == null) {
+ throw new IllegalArgumentException("attributes must specify margins");
+ }
+ // TODO(sgurun) get rid of AwPdfExportAttributes after upstreaming
+ // and move this logic to AwPdfExporter
+ AwPdfExportAttributes pdfAttributes = new AwPdfExportAttributes();
+ pdfAttributes.pageWidth = mAttributes.getMediaSize().getWidthMils();
+ pdfAttributes.pageHeight = mAttributes.getMediaSize().getHeightMils();
+ pdfAttributes.dpi = getPrintDpi(mAttributes);
+ pdfAttributes.leftMargin = mAttributes.getMinMargins().getLeftMils();
+ pdfAttributes.rightMargin = mAttributes.getMinMargins().getRightMils();
+ pdfAttributes.topMargin = mAttributes.getMinMargins().getTopMils();
+ pdfAttributes.bottomMargin = mAttributes.getMinMargins().getBottomMils();
+ exportPdf(destination, pdfAttributes, cancellationSignal, callback);
+ }
+
+ private static int getPrintDpi(PrintAttributes attributes) {
+ // TODO(sgurun) android print attributes support horizontal and
+ // vertical DPI. Chrome has only one DPI. Revisit this.
+ int horizontalDpi = attributes.getResolution().getHorizontalDpi();
+ int verticalDpi = attributes.getResolution().getVerticalDpi();
+ if (horizontalDpi != verticalDpi) {
+ Log.w(TAG, "Horizontal and vertical DPIs differ. Using horizontal DPI " +
+ " hDpi=" + horizontalDpi + " vDPI=" + verticalDpi);
+ }
+ return horizontalDpi;
+ }
+
+ private void exportPdf(final ParcelFileDescriptor destination,
+ final AwPdfExportAttributes attributes,
+ final CancellationSignal signal,
+ final WriteResultCallback callback) {
+ mPdfExporter.exportToPdf(destination, attributes, new ValueCallback<Boolean>() {
+ @Override
+ public void onReceiveValue(Boolean value) {
+ if (value) {
+ callback.onWriteFinished(new PageRange[] {PageRange.ALL_PAGES});
+ } else {
+ // TODO(sgurun) localized error message
+ callback.onWriteFailed(null);
+ }
+ }
+ }, signal);
+ }
+}
+

Powered by Google App Engine
This is Rietveld 408576698