diff options
author | cimamoglu@chromium.org <cimamoglu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-04 21:28:54 +0000 |
---|---|---|
committer | cimamoglu@chromium.org <cimamoglu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-04 21:28:54 +0000 |
commit | 334c6d06ca072128348ee8e0f39a687b8ac14b5e (patch) | |
tree | 5224785514b7475bae66f84a39e3ee209041fa84 /printing/android | |
parent | cc5e8f152817ca6102d0f15d5c3a5452e04553f1 (diff) | |
download | chromium_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/android')
-rw-r--r-- | printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java | 145 | ||||
-rw-r--r-- | printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java | 39 |
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; |