package com.fastebro.androidrgbtool.print; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.pdf.PdfDocument; 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.PrintDocumentInfo; import android.print.pdf.PrintedPdfDocument; import android.support.annotation.NonNull; import android.widget.Toast; import com.fastebro.androidrgbtool.R; import com.fastebro.androidrgbtool.palette.PaletteSwatch; import com.fastebro.androidrgbtool.utils.PaletteUtils; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; /** * Created by danielealtomare on 01/03/15. * Project: rgb-tool */ public class RGBToolPrintPaletteAdapter extends PrintDocumentAdapter { private final Context context; private final String message; private final String filename; private final ArrayList<PaletteSwatch> swatches; private PrintedPdfDocument pdfDocument; public RGBToolPrintPaletteAdapter(@NonNull Context context, String message, String filename, ArrayList<PaletteSwatch> swatches) { this.context = context; this.message = message; this.filename = filename; this.swatches = swatches; } @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { // Create a new PdfDocument with the requested page attributes pdfDocument = new PrintedPdfDocument(context, newAttributes); // Respond to cancellation request if (cancellationSignal.isCanceled()) { Toast.makeText(context, context.getString(R.string.print_job_canceled), Toast.LENGTH_SHORT).show(); callback.onLayoutCancelled(); return; } // Compute the expected number of printed pages int pages = computePageCount(newAttributes); if (pages > 0) { // Return print information to print framework PrintDocumentInfo info = new PrintDocumentInfo.Builder( "rgbtool_" + filename + "_palette.pdf") .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .setPageCount(pages) .build(); // Content layout reflow is complete callback.onLayoutFinished(info, true); } else { // Otherwise report an error to the print framework callback.onLayoutFailed("Page count calculation failed."); } } @Override public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) { PdfDocument.Page page = pdfDocument.startPage(0); // check for cancellation if (cancellationSignal.isCanceled()) { Toast.makeText(context, context.getString(R.string.print_job_canceled), Toast.LENGTH_SHORT).show(); callback.onWriteCancelled(); pdfDocument.close(); pdfDocument = null; return; } // Draw page content for printing drawPage(page); // Rendering is complete, so page can be finalized. pdfDocument.finishPage(page); // Write PDF document to file try { pdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); } catch (IOException e) { Toast.makeText(context, context.getString(R.string.print_error), Toast.LENGTH_SHORT).show(); callback.onWriteFailed(e.toString()); return; } finally { pdfDocument.close(); pdfDocument = null; } // Signal the print framework the document is complete callback.onWriteFinished(pages); } @SuppressWarnings("SameReturnValue") private int computePageCount(PrintAttributes printAttributes) { return 1; } @SuppressWarnings("SameReturnValue") private int getPrintItemCount() { return 1; } private void drawPage(PdfDocument.Page page) { Canvas canvas = page.getCanvas(); StringBuilder token; // units are in points (1/72 of an inch) int titleBaseLine = 72; int leftMargin = 54; Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setTextSize(20); canvas.drawText(context.getString(R.string.app_name), leftMargin, titleBaseLine, paint); paint.setTextSize(16); canvas.drawText(filename + " palette", leftMargin, titleBaseLine + 25, paint); // Color description summary. paint.setTextSize(14); for(int i = 0; i < swatches.size(); i++) { paint.setColor(Color.BLACK); token = new StringBuilder(); token.append("Type: "); token.append(PaletteUtils.getSwatchDescription(context, swatches.get(i).getType())); canvas.drawText(token.toString(), leftMargin, titleBaseLine + (50 + (i * 100)), paint); token = new StringBuilder(); token.append("HEX: "); token.append(Integer.toHexString(swatches.get(i).getRgb()).toUpperCase()); canvas.drawText(token.toString(), leftMargin, titleBaseLine + (75 + (i * 100)), paint); paint.setColor(swatches.get(i).getRgb()); canvas.drawRect(leftMargin, titleBaseLine + (90 + (i * 100)), 126, titleBaseLine + (90 + (i * 100)) + 30, paint); } // User message. if (message != null) { paint.setColor(Color.BLACK); paint.setTextSize(10); canvas.drawText(message, leftMargin, titleBaseLine + (50 + (swatches.size() * 100)) + 10, paint); } } }