summaryrefslogtreecommitdiffstats
path: root/printing
diff options
context:
space:
mode:
authorcimamoglu@chromium.org <cimamoglu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-04 21:28:54 +0000
committercimamoglu@chromium.org <cimamoglu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-04 21:28:54 +0000
commit334c6d06ca072128348ee8e0f39a687b8ac14b5e (patch)
tree5224785514b7475bae66f84a39e3ee209041fa84 /printing
parentcc5e8f152817ca6102d0f15d5c3a5452e04553f1 (diff)
downloadchromium_src-334c6d06ca072128348ee8e0f39a687b8ac14b5e.zip
chromium_src-334c6d06ca072128348ee8e0f39a687b8ac14b5e.tar.gz
chromium_src-334c6d06ca072128348ee8e0f39a687b8ac14b5e.tar.bz2
Android: refactors printing code & adds a test
Review URL: https://codereview.chromium.org/85693005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238776 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r--printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java145
-rw-r--r--printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java39
2 files changed, 170 insertions, 14 deletions
diff --git a/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java b/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java
new file mode 100644
index 0000000..1f1f27a
--- /dev/null
+++ b/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java
@@ -0,0 +1,145 @@
+// 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.printing;
+
+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.PrintDocumentAdapter.LayoutResultCallback;
+import android.print.PrintDocumentAdapter.WriteResultCallback;
+import android.print.PrintDocumentInfo;
+
+/**
+ * Wrapper for {@link PrintDocumentAdapter} for easier testing.
+ *
+ * Normally, {@link PrintDocumentAdapter#LayoutResultCallback} and
+ * {@link PrintDocumentAdapter#WriteResultCallback} don't have public constructors. This makes
+ * it impossible to subclass them, which is required to emulate calls to
+ * {@link PrintDocumentAdapter#onLayout} and {@link PrintDocumentAdapter#onWrite}. This class helps
+ * bypassing the limitation.
+ */
+public class PrintDocumentAdapterWrapper extends PrintDocumentAdapter {
+ private PdfGenerator mPdfGenerator;
+
+ public static interface PdfGenerator {
+ void onStart();
+ void onLayout(
+ PrintAttributes oldAttributes,
+ PrintAttributes newAttributes,
+ CancellationSignal cancellationSignal,
+ PrintDocumentAdapterWrapper.LayoutResultCallbackWrapper callback,
+ Bundle metadata);
+ void onWrite(
+ final PageRange[] ranges,
+ final ParcelFileDescriptor destination,
+ final CancellationSignal cancellationSignal,
+ final PrintDocumentAdapterWrapper.WriteResultCallbackWrapper callback);
+ void onFinish();
+ }
+
+ public static interface LayoutResultCallbackWrapper {
+ void onLayoutFinished(PrintDocumentInfo info, boolean changed);
+ void onLayoutFailed(CharSequence error);
+ void onLayoutCancelled();
+ }
+
+ public static interface WriteResultCallbackWrapper {
+ void onWriteFinished(PageRange[] pages);
+ void onWriteFailed(CharSequence error);
+ void onWriteCancelled();
+ }
+
+ public static class LayoutResultCallbackWrapperImpl implements LayoutResultCallbackWrapper {
+ private LayoutResultCallback mCallback = null;
+ public LayoutResultCallbackWrapperImpl(LayoutResultCallback callback) {
+ assert callback != null;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onLayoutFinished(PrintDocumentInfo info, boolean changed) {
+ mCallback.onLayoutFinished(info, changed);
+ }
+
+ @Override
+ public void onLayoutFailed(CharSequence error) {
+ mCallback.onLayoutFailed(error);
+ }
+
+ @Override
+ public void onLayoutCancelled() {
+ mCallback.onLayoutCancelled();
+ }
+ }
+
+ public static class WriteResultCallbackWrapperImpl implements WriteResultCallbackWrapper {
+ private WriteResultCallback mCallback = null;
+ public WriteResultCallbackWrapperImpl(WriteResultCallback callback) {
+ assert callback != null;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onWriteFinished(PageRange[] pages) {
+ mCallback.onWriteFinished(pages);
+ }
+
+ @Override
+ public void onWriteFailed(CharSequence error) {
+ mCallback.onWriteFailed(error);
+ }
+
+ @Override
+ public void onWriteCancelled() {
+ mCallback.onWriteCancelled();
+ }
+ }
+
+ public void setPdfGenerator(PdfGenerator pdfGenerator) {
+ mPdfGenerator = pdfGenerator;
+ }
+
+ /**
+ * Initiates the printing process within the framework
+ */
+ public void print(PrintManagerDelegate printManager, String title) {
+ printManager.print(title, this, null);
+ }
+
+ @Override
+ public void onStart() {
+ mPdfGenerator.onStart();
+ }
+
+ @Override
+ public void onLayout(
+ PrintAttributes oldAttributes,
+ PrintAttributes newAttributes,
+ CancellationSignal cancellationSignal,
+ LayoutResultCallback callback,
+ Bundle metadata) {
+ mPdfGenerator.onLayout(oldAttributes, newAttributes, cancellationSignal,
+ new LayoutResultCallbackWrapperImpl(callback), metadata);
+ }
+
+ @Override
+ public void onWrite(
+ final PageRange[] ranges,
+ final ParcelFileDescriptor destination,
+ final CancellationSignal cancellationSignal,
+ final WriteResultCallback callback) {
+ mPdfGenerator.onWrite(ranges, destination, cancellationSignal,
+ new WriteResultCallbackWrapperImpl(callback));
+ }
+
+ @Override
+ public void onFinish() {
+ super.onFinish();
+ mPdfGenerator.onFinish();
+ }
+} \ No newline at end of file
diff --git a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
index 239cff0..3ef2e7b 100644
--- a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
+++ b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
@@ -5,6 +5,7 @@
package org.chromium.printing;
import org.chromium.base.ThreadUtils;
+import org.chromium.printing.PrintDocumentAdapterWrapper.PdfGenerator;;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -14,8 +15,6 @@ import android.print.PrintAttributes;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Resolution;
import android.print.PrintDocumentAdapter;
-import android.print.PrintDocumentAdapter.LayoutResultCallback;
-import android.print.PrintDocumentAdapter.WriteResultCallback;
import android.print.PrintDocumentInfo;
import java.io.IOException;
@@ -30,7 +29,7 @@ import java.util.Iterator;
* print button. The singleton object lives in UI thread. Interaction with the native side is
* carried through PrintingContext class.
*/
-public class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingController {
+public class PrintingControllerImpl implements PrintingController, PdfGenerator {
private static final String LOG_TAG = "PrintingControllerImpl";
@@ -66,7 +65,7 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
private int[] mPages;
/** The callback function to inform the result of PDF generation to the framework. */
- private PrintDocumentAdapter.WriteResultCallback mOnWriteCallback;
+ private PrintDocumentAdapterWrapper.WriteResultCallbackWrapper mOnWriteCallback;
/**
* The callback function to inform the result of layout to the framework. We save the callback
@@ -74,11 +73,14 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
* number of expected pages back to the framework through this callback once the native side
* has that information.
*/
- private PrintDocumentAdapter.LayoutResultCallback mOnLayoutCallback;
+ private PrintDocumentAdapterWrapper.LayoutResultCallbackWrapper mOnLayoutCallback;
/** The object through which native PDF generation process is initiated. */
private Printable mPrintable;
+ /** The object through which the framework will make calls for generating PDF. */
+ private PrintDocumentAdapterWrapper mPrintDocumentAdapterWrapper;
+
private int mPrintingState = PRINTING_STATE_READY;
/** Whether layouting parameters have been changed to require a new PDF generation. */
@@ -87,9 +89,13 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
/** Total number of pages to print with initial print dialog settings. */
private int mLastKnownMaxPages = PrintDocumentInfo.PAGE_COUNT_UNKNOWN;
- private PrintingControllerImpl(PrintManagerDelegate printManager, String errorText) {
+ private PrintingControllerImpl(PrintManagerDelegate printManager,
+ PrintDocumentAdapterWrapper printDocumentAdapterWrapper,
+ String errorText) {
mPrintManager = printManager;
mErrorMessage = errorText;
+ mPrintDocumentAdapterWrapper = printDocumentAdapterWrapper;
+ mPrintDocumentAdapterWrapper.setPdfGenerator(this);
}
/**
@@ -97,17 +103,20 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
*
* The controller is a singleton, since there can be only one printing action at any time.
*
+ * @param printDocumentAdapterWrapper The object through which the framework will make calls
+ * for generating PDF.
* @param errorText The error message to be shown to user in case something goes wrong in PDF
* generation in Chromium. We pass it here as a string so src/printing/android
* doesn't need any string dependency.
* @return The resulting PrintingController.
*/
public static PrintingController create(PrintManagerDelegate printManager,
- String errorText) {
+ PrintDocumentAdapterWrapper printDocumentAdapterWrapper, String errorText) {
ThreadUtils.assertOnUiThread();
if (sInstance == null) {
- sInstance = new PrintingControllerImpl(printManager, errorText);
+ sInstance = new PrintingControllerImpl(printManager,
+ printDocumentAdapterWrapper, errorText);
}
return sInstance;
}
@@ -162,7 +171,7 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
@Override
public void startPrint(final Printable printable) {
mPrintable = printable;
- mPrintManager.print(printable.getTitle(), this, null);
+ mPrintDocumentAdapterWrapper.print(mPrintManager, printable.getTitle());
}
@Override
@@ -186,9 +195,12 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
}
@Override
- public void onLayout(PrintAttributes oldAttributes,
- PrintAttributes newAttributes, CancellationSignal cancellationSignal,
- LayoutResultCallback callback, Bundle metadata) {
+ public void onLayout(
+ PrintAttributes oldAttributes,
+ PrintAttributes newAttributes,
+ CancellationSignal cancellationSignal,
+ PrintDocumentAdapterWrapper.LayoutResultCallbackWrapper callback,
+ Bundle metadata) {
// NOTE: Chrome printing just supports one DPI, whereas Android has both vertical and
// horizontal. These two values are most of the time same, so we just pass one of them.
mDpi = newAttributes.getResolution().getHorizontalDpi();
@@ -248,7 +260,7 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
final PageRange[] ranges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
- final WriteResultCallback callback) {
+ final PrintDocumentAdapterWrapper.WriteResultCallbackWrapper callback) {
if (mPrintingContext == null) {
callback.onWriteFailed(mErrorMessage);
resetCallbacks();
@@ -290,7 +302,6 @@ public class PrintingControllerImpl extends PrintDocumentAdapter implements Prin
@Override
public void onFinish() {
- super.onFinish();
mLastKnownMaxPages = PrintDocumentInfo.PAGE_COUNT_UNKNOWN;
mPages = null;