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); |
+} |