Home | History | Annotate | Download | only in printing
      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 }