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

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

Issue 54963005: Upstream printing changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 7 years 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/AwPdfExporter.java
diff --git a/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java b/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..747a09d39d95a9a0d393f462389bf41ce21eb2ac
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java
@@ -0,0 +1,142 @@
+// 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.os.CancellationSignal;
+import android.os.ParcelFileDescriptor;
+import android.print.PrintAttributes;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.webkit.ValueCallback;
+
+import java.io.OutputStream;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+/**
+ * Export the android webview as a PDF.
+ * @TODO(sgurun) explain the ownership of this class and its native counterpart
+ */
+@JNINamespace("android_webview")
+public class AwPdfExporter {
+
+ private static final String TAG = "AwPdfExporter";
+ private long mNativeAwPdfExporter;
+ // TODO(sgurun) result callback should return an int/object indicating errors.
+ // potential errors: invalid print parameters, already pending, IO error
+ private ValueCallback<Boolean> mResultCallback;
+ private PrintAttributes mAttributes;
+ private ParcelFileDescriptor mFd;
+ // Maintain a reference to the top level object (i.e. WebView) since in a common
+ // use case (offscreen webview) application may expect the framework's print manager
+ // to own the Webview (via PrintDocumentAdapter).
+ private final ViewGroup mContainerView;
+
+ AwPdfExporter(ViewGroup containerView) {
+ mContainerView = containerView;
+ }
+
+ public void exportToPdf(final ParcelFileDescriptor fd, PrintAttributes attributes,
+ ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) {
+
+ if (fd == null) {
+ throw new IllegalArgumentException("fd cannot be null");
+ }
+ if (resultCallback == null) {
+ throw new IllegalArgumentException("resultCallback cannot be null");
+ }
+ if (mResultCallback != null) {
+ throw new IllegalStateException("printing is already pending");
+ }
+ if (attributes.getMediaSize() == null) {
+ throw new IllegalArgumentException("attributes must specify a media size");
+ }
+ if (attributes.getResolution() == null) {
+ throw new IllegalArgumentException("attributes must specify print resolution");
+ }
+ if (attributes.getMinMargins() == null) {
+ throw new IllegalArgumentException("attributes must specify margins");
+ }
+ if (mNativeAwPdfExporter == 0) {
+ resultCallback.onReceiveValue(false);
+ return;
+ }
+ mResultCallback = resultCallback;
+ mAttributes = attributes;
+ mFd = fd;
+ nativeExportToPdf(mNativeAwPdfExporter, mFd.getFd(), cancellationSignal);
+ }
+
+ @CalledByNative
+ private void setNativeAwPdfExporter(int nativePdfExporter) {
+ mNativeAwPdfExporter = nativePdfExporter;
+ // Handle the cornercase that Webview.Destroy is called before the native side
+ // has a chance to complete the pdf exporting.
+ if (nativePdfExporter == 0 && mResultCallback != null) {
+ mResultCallback.onReceiveValue(false);
+ mResultCallback = null;
+ }
+ }
+
+ 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;
+ }
+
+ @CalledByNative
+ private void didExportPdf(boolean success) {
+ mResultCallback.onReceiveValue(success);
+ mResultCallback = null;
+ mAttributes = null;
+ // The caller should close the file.
+ mFd = null;
+ }
+
+ @CalledByNative
+ private int getPageWidth() {
+ return mAttributes.getMediaSize().getWidthMils();
+ }
+
+ @CalledByNative
+ private int getPageHeight() {
+ return mAttributes.getMediaSize().getHeightMils();
+ }
+
+ @CalledByNative
+ private int getDpi() {
+ return getPrintDpi(mAttributes);
+ }
+
+ @CalledByNative
+ private int getLeftMargin() {
+ return mAttributes.getMinMargins().getLeftMils();
+ }
+
+ @CalledByNative
+ private int getRightMargin() {
+ return mAttributes.getMinMargins().getRightMils();
+ }
+
+ @CalledByNative
+ private int getTopMargin() {
+ return mAttributes.getMinMargins().getTopMils();
+ }
+
+ @CalledByNative
+ private int getBottomMargin() {
+ return mAttributes.getMinMargins().getBottomMils();
+ }
+
+ private native void nativeExportToPdf(long nativeAwPdfExporter, int fd,
+ CancellationSignal cancellationSignal);
+}

Powered by Google App Engine
This is Rietveld 408576698