1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.printing; 6 7 import android.os.Bundle; 8 import android.os.CancellationSignal; 9 import android.os.ParcelFileDescriptor; 10 import android.print.PageRange; 11 import android.print.PrintAttributes; 12 import android.print.PrintDocumentAdapter; 13 import android.print.PrintDocumentInfo; 14 15 /** 16 * Wrapper for {@link PrintDocumentAdapter} for easier testing. 17 * 18 * Normally, {@link PrintDocumentAdapter#LayoutResultCallback} and 19 * {@link PrintDocumentAdapter#WriteResultCallback} don't have public constructors. This makes 20 * it impossible to subclass them, which is required to emulate calls to 21 * {@link PrintDocumentAdapter#onLayout} and {@link PrintDocumentAdapter#onWrite}. This class helps 22 * bypassing the limitation. 23 */ 24 public class PrintDocumentAdapterWrapper extends PrintDocumentAdapter { 25 private PdfGenerator mPdfGenerator; 26 27 public static interface PdfGenerator { 28 void onStart(); 29 void onLayout( 30 PrintAttributes oldAttributes, 31 PrintAttributes newAttributes, 32 CancellationSignal cancellationSignal, 33 PrintDocumentAdapterWrapper.LayoutResultCallbackWrapper callback, 34 Bundle metadata); 35 void onWrite( 36 final PageRange[] ranges, 37 final ParcelFileDescriptor destination, 38 final CancellationSignal cancellationSignal, 39 final PrintDocumentAdapterWrapper.WriteResultCallbackWrapper callback); 40 void onFinish(); 41 } 42 43 public static interface LayoutResultCallbackWrapper { 44 void onLayoutFinished(PrintDocumentInfo info, boolean changed); 45 void onLayoutFailed(CharSequence error); 46 void onLayoutCancelled(); 47 } 48 49 public static interface WriteResultCallbackWrapper { 50 void onWriteFinished(PageRange[] pages); 51 void onWriteFailed(CharSequence error); 52 void onWriteCancelled(); 53 } 54 55 public static class LayoutResultCallbackWrapperImpl implements LayoutResultCallbackWrapper { 56 private LayoutResultCallback mCallback = null; 57 public LayoutResultCallbackWrapperImpl(LayoutResultCallback callback) { 58 assert callback != null; 59 mCallback = callback; 60 } 61 62 @Override 63 public void onLayoutFinished(PrintDocumentInfo info, boolean changed) { 64 mCallback.onLayoutFinished(info, changed); 65 } 66 67 @Override 68 public void onLayoutFailed(CharSequence error) { 69 mCallback.onLayoutFailed(error); 70 } 71 72 @Override 73 public void onLayoutCancelled() { 74 mCallback.onLayoutCancelled(); 75 } 76 } 77 78 public static class WriteResultCallbackWrapperImpl implements WriteResultCallbackWrapper { 79 private WriteResultCallback mCallback = null; 80 public WriteResultCallbackWrapperImpl(WriteResultCallback callback) { 81 assert callback != null; 82 mCallback = callback; 83 } 84 85 @Override 86 public void onWriteFinished(PageRange[] pages) { 87 mCallback.onWriteFinished(pages); 88 } 89 90 @Override 91 public void onWriteFailed(CharSequence error) { 92 mCallback.onWriteFailed(error); 93 } 94 95 @Override 96 public void onWriteCancelled() { 97 mCallback.onWriteCancelled(); 98 } 99 } 100 101 public void setPdfGenerator(PdfGenerator pdfGenerator) { 102 mPdfGenerator = pdfGenerator; 103 } 104 105 /** 106 * Initiates the printing process within the framework 107 */ 108 public void print(PrintManagerDelegate printManager, String title) { 109 printManager.print(title, this, null); 110 } 111 112 @Override 113 public void onStart() { 114 mPdfGenerator.onStart(); 115 } 116 117 @Override 118 public void onLayout( 119 PrintAttributes oldAttributes, 120 PrintAttributes newAttributes, 121 CancellationSignal cancellationSignal, 122 LayoutResultCallback callback, 123 Bundle metadata) { 124 mPdfGenerator.onLayout(oldAttributes, newAttributes, cancellationSignal, 125 new LayoutResultCallbackWrapperImpl(callback), metadata); 126 } 127 128 @Override 129 public void onWrite( 130 final PageRange[] ranges, 131 final ParcelFileDescriptor destination, 132 final CancellationSignal cancellationSignal, 133 final WriteResultCallback callback) { 134 mPdfGenerator.onWrite(ranges, destination, cancellationSignal, 135 new WriteResultCallbackWrapperImpl(callback)); 136 } 137 138 @Override 139 public void onFinish() { 140 super.onFinish(); 141 mPdfGenerator.onFinish(); 142 } 143 }