diff options
author | Svetoslav <svetoslavganov@google.com> | 2013-09-18 15:58:28 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2013-09-19 17:12:47 -0700 |
commit | 6811f4e92cbb64e72a0d13eb9b99b5894bd59c76 (patch) | |
tree | 5b0ebddf52a449b1ea84d91d6313e897a03e2b3e | |
parent | f95c9aa7e1229963a4cb92eed46eafc205b03cb3 (diff) | |
download | frameworks_base-6811f4e92cbb64e72a0d13eb9b99b5894bd59c76.zip frameworks_base-6811f4e92cbb64e72a0d13eb9b99b5894bd59c76.tar.gz frameworks_base-6811f4e92cbb64e72a0d13eb9b99b5894bd59c76.tar.bz2 |
Move PdfDocument to android.graphics.pdf
1. Move PdfDocument to android.graphics.pdf.
2. Changed the PdfDocument as per API concil request.
3. Updated the documentation.
bug:10461180
bug:10552565
bug:10681585
bug:10552336
Change-Id: I08e15b34cf37bb064248c887e6f59808019cafe8
-rw-r--r-- | api/current.txt | 76 | ||||
-rw-r--r-- | core/java/android/print/PrintDocumentAdapter.java | 10 | ||||
-rw-r--r-- | core/java/android/print/pdf/PrintedPdfDocument.java | 147 | ||||
-rw-r--r-- | core/java/android/printservice/package.html | 4 | ||||
-rw-r--r-- | core/jni/Android.mk | 2 | ||||
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 4 | ||||
-rw-r--r-- | core/jni/android/graphics/pdf/PdfDocument.cpp (renamed from core/jni/android/print/android_print_pdf_PdfDocument.cpp) | 27 | ||||
-rw-r--r-- | graphics/java/android/graphics/pdf/PdfDocument.java (renamed from core/java/android/print/pdf/PdfDocument.java) | 186 | ||||
-rw-r--r-- | graphics/java/android/graphics/pdf/package.html | 5 | ||||
-rw-r--r-- | packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java | 2 |
10 files changed, 236 insertions, 227 deletions
diff --git a/api/current.txt b/api/current.txt index b4e101e..8079acb 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10371,6 +10371,37 @@ package android.graphics.drawable.shapes { } +package android.graphics.pdf { + + public class PdfDocument { + ctor public PdfDocument(); + method public void close(); + method public void finishPage(android.graphics.pdf.PdfDocument.Page); + method public java.util.List<android.graphics.pdf.PdfDocument.PageInfo> getPages(); + method public android.graphics.pdf.PdfDocument.Page startPage(android.graphics.pdf.PdfDocument.PageInfo); + method public void writeTo(java.io.OutputStream) throws java.io.IOException; + } + + public static final class PdfDocument.Page { + method public android.graphics.Canvas getCanvas(); + method public android.graphics.pdf.PdfDocument.PageInfo getInfo(); + } + + public static final class PdfDocument.PageInfo { + method public android.graphics.Rect getContentRect(); + method public int getPageHeight(); + method public int getPageNumber(); + method public int getPageWidth(); + } + + public static final class PdfDocument.PageInfo.Builder { + ctor public PdfDocument.PageInfo.Builder(int, int, int); + method public android.graphics.pdf.PdfDocument.PageInfo create(); + method public android.graphics.pdf.PdfDocument.PageInfo.Builder setContentRect(android.graphics.Rect); + } + +} + package android.hardware { public class Camera { @@ -19250,7 +19281,7 @@ package android.print { method public abstract void onLayout(android.print.PrintAttributes, android.print.PrintAttributes, android.os.CancellationSignal, android.print.PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle); method public void onStart(); method public abstract void onWrite(android.print.PageRange[], android.os.ParcelFileDescriptor, android.os.CancellationSignal, android.print.PrintDocumentAdapter.WriteResultCallback); - field public static final java.lang.String METADATA_KEY_PRINT_PREVIEW = "KEY_METADATA_PRINT_PREVIEW"; + field public static final java.lang.String EXTRA_PRINT_PREVIEW = "EXTRA_PRINT_PREVIEW"; } public static abstract class PrintDocumentAdapter.LayoutResultCallback { @@ -19386,41 +19417,12 @@ package android.print { package android.print.pdf { - public final class PdfDocument { - method public void close(); - method public void finishPage(android.print.pdf.PdfDocument.Page); - method public java.util.List<android.print.pdf.PdfDocument.PageInfo> getPages(); - method public static android.print.pdf.PdfDocument open(); - method public android.print.pdf.PdfDocument.Page startPage(android.print.pdf.PdfDocument.PageInfo); - method public void writeTo(java.io.OutputStream); - } - - public static final class PdfDocument.Page { - method public android.graphics.Canvas getCanvas(); - method public android.print.pdf.PdfDocument.PageInfo getInfo(); - } - - public static final class PdfDocument.PageInfo { - method public android.graphics.Rect getContentSize(); - method public android.graphics.Matrix getInitialTransform(); - method public int getPageNumber(); - method public android.graphics.Rect getPageSize(); - } - - public static final class PdfDocument.PageInfo.Builder { - ctor public PdfDocument.PageInfo.Builder(android.graphics.Rect, int); - method public android.print.pdf.PdfDocument.PageInfo create(); - method public android.print.pdf.PdfDocument.PageInfo.Builder setContentSize(android.graphics.Rect); - method public android.print.pdf.PdfDocument.PageInfo.Builder setInitialTransform(android.graphics.Matrix); - } - - public final class PrintedPdfDocument { - method public void close(); - method public void finishPage(android.print.pdf.PdfDocument.Page); - method public java.util.List<android.print.pdf.PdfDocument.PageInfo> getPages(); - method public static android.print.pdf.PrintedPdfDocument open(android.content.Context, android.print.PrintAttributes); - method public android.print.pdf.PdfDocument.Page startPage(int); - method public void writeTo(java.io.OutputStream); + public class PrintedPdfDocument extends android.graphics.pdf.PdfDocument { + ctor public PrintedPdfDocument(android.content.Context, android.print.PrintAttributes); + method public android.graphics.Rect getPageContentRect(); + method public int getPageHeight(); + method public int getPageWidth(); + method public android.graphics.pdf.PdfDocument.Page startPage(int); } } @@ -31650,8 +31652,6 @@ package android.widget { ctor public NumberPicker(android.content.Context); ctor public NumberPicker(android.content.Context, android.util.AttributeSet); ctor public NumberPicker(android.content.Context, android.util.AttributeSet, int); - method public int computeVerticalScrollOffset(); - method public int computeVerticalScrollRange(); method public java.lang.String[] getDisplayedValues(); method public int getMaxValue(); method public int getMinValue(); diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java index 8ac34c1..4113ac7 100644 --- a/core/java/android/print/PrintDocumentAdapter.java +++ b/core/java/android/print/PrintDocumentAdapter.java @@ -74,10 +74,10 @@ import android.os.ParcelFileDescriptor; public abstract class PrintDocumentAdapter { /** - * Meta-data key: mapped to a boolean value that is <code>true</code> if + * Extra: mapped to a boolean value that is <code>true</code> if * the current layout is for a print preview, <code>false</code> otherwise. */ - public static final String METADATA_KEY_PRINT_PREVIEW = "KEY_METADATA_PRINT_PREVIEW"; + public static final String EXTRA_PRINT_PREVIEW = "EXTRA_PRINT_PREVIEW"; /** * Called when printing starts. You can use this callback to allocate @@ -112,15 +112,15 @@ public abstract class PrintDocumentAdapter { * @param newAttributes The new print attributes. * @param cancellationSignal Signal for observing cancel layout requests. * @param callback Callback to inform the system for the layout result. - * @param metadata Additional information about how layout the content. + * @param extras Additional information about how to layout the content. * * @see LayoutResultCallback * @see CancellationSignal - * @see #METADATA_KEY_PRINT_PREVIEW + * @see #EXTRA_PRINT_PREVIEW */ public abstract void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, - Bundle metadata); + Bundle extras); /** * Called when specific pages of the content should be written in the diff --git a/core/java/android/print/pdf/PrintedPdfDocument.java b/core/java/android/print/pdf/PrintedPdfDocument.java index 1fd4646..2d8aafa 100644 --- a/core/java/android/print/pdf/PrintedPdfDocument.java +++ b/core/java/android/print/pdf/PrintedPdfDocument.java @@ -18,67 +18,81 @@ package android.print.pdf; import android.content.Context; import android.graphics.Rect; +import android.graphics.pdf.PdfDocument; +import android.graphics.pdf.PdfDocument.Page; +import android.graphics.pdf.PdfDocument.PageInfo; import android.print.PrintAttributes; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; -import android.print.pdf.PdfDocument; -import android.print.pdf.PdfDocument.Page; -import android.print.pdf.PdfDocument.PageInfo; - -import java.io.OutputStream; -import java.util.List; /** - * This class is a helper for printing content to a different media - * size. This class is responsible for computing a correct page size - * given some print constraints, i.e. {@link PrintAttributes}. It is - * an adapter around a {@link PdfDocument}. + * This class is a helper for creating a PDF file for given print + * attributes. It is useful for implementing printing via the native + * Android graphics APIs. + * <p> + * This class computes the page width, page height, and content rectangle + * from the provided print attributes and these precomputed values can be + * accessed via {@link #getPageWidth()}, {@link #getPageHeight()}, and + * {@link #getPageContentRect()}, respectively. The {@link #startPage(int)} + * methods creates pages whose {@link PageInfo} is initialized with the + * precomputed values for width, height, and content rectangle. + * <p> + * A typical use of the APIs looks like this: + * </p> + * <pre> + * // open a new document + * PrintedPdfDocument document = new PrintedPdfDocument(context, + * printAttributes); + * + * // start a page + * Page page = document.startPage(0); + * + * // draw something on the page + * View content = getContentView(); + * content.draw(page.getCanvas()); + * + * // finish the page + * document.finishPage(page); + * . . . + * // add more pages + * . . . + * // write the document content + * document.writeTo(getOutputStream()); + * + * //close the document + * document.close(); + * </pre> */ -public final class PrintedPdfDocument { +public class PrintedPdfDocument extends PdfDocument { private static final int MILS_PER_INCH = 1000; private static final int POINTS_IN_INCH = 72; - private final PdfDocument mDocument = PdfDocument.open(); - private final Rect mPageSize = new Rect(); - private final Rect mContentSize = new Rect(); + private final int mPageWidth; + private final int mPageHeight; + private final Rect mContentRect; /** - * Opens a new document. The document pages are computed based on - * the passes in {@link PrintAttributes}. + * Creates a new document. * <p> * <strong>Note:</strong> You must close the document after you are - * done by calling {@link #close()} + * done by calling {@link #close()}. * </p> * * @param context Context instance for accessing resources. * @param attributes The print attributes. - * @return The document. - * - * @see #close() - */ - public static PrintedPdfDocument open(Context context, PrintAttributes attributes) { - return new PrintedPdfDocument(context, attributes); - } - - /** - * Creates a new instance. - * - * @param context Context instance for accessing resources and services. - * @param attributes The {@link PrintAttributes} to user. */ - private PrintedPdfDocument(Context context, PrintAttributes attributes) { + public PrintedPdfDocument(Context context, PrintAttributes attributes) { MediaSize mediaSize = attributes.getMediaSize(); // Compute the size of the target canvas from the attributes. - final int pageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) + mPageWidth = (int) (((float) mediaSize.getWidthMils() / MILS_PER_INCH) * POINTS_IN_INCH); - final int pageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) + mPageHeight = (int) (((float) mediaSize.getHeightMils() / MILS_PER_INCH) * POINTS_IN_INCH); - mPageSize.set(0, 0, pageWidth, pageHeight); // Compute the content size from the attributes. Margins minMargins = attributes.getMinMargins(); - final int marginLeft = (int) (((float) minMargins.getLeftMils() /MILS_PER_INCH) + final int marginLeft = (int) (((float) minMargins.getLeftMils() / MILS_PER_INCH) * POINTS_IN_INCH); final int marginTop = (int) (((float) minMargins.getTopMils() / MILS_PER_INCH) * POINTS_IN_INCH); @@ -86,14 +100,14 @@ public final class PrintedPdfDocument { * POINTS_IN_INCH); final int marginBottom = (int) (((float) minMargins.getBottomMils() / MILS_PER_INCH) * POINTS_IN_INCH); - mContentSize.set(mPageSize.left + marginLeft, mPageSize.top + marginTop, - mPageSize.right - marginRight, mPageSize.bottom - marginBottom); + mContentRect = new Rect(marginLeft, marginTop, mPageWidth - marginRight, + mPageHeight - marginBottom); } /** - * Starts a page using a page size computed from the print attributes - * passed in {@link #open(Context, PrintAttributes)} and the given page - * number to create appropriate {@link PageInfo}. + * Starts a new page. The page is created using width, height and content + * rectangle computed from the print attributes passed in the constructor + * and the given page number to create an appropriate {@link PageInfo}. * <p> * After the page is created you can draw arbitrary content on the page's * canvas which you can get by calling {@link Page#getCanvas() Page.getCanvas()}. @@ -103,63 +117,48 @@ public final class PrintedPdfDocument { * </p> * <p> * <strong>Note:</strong> Do not call this method after {@link #close()}. + * Also do not call this method if the last page returned by this method + * is not finished by calling {@link #finishPage(Page)}. * </p> * - * @param pageNumber The page number. + * @param pageNumber The page number. Must be a positive value. * @return A blank page. * * @see #finishPage(Page) */ public Page startPage(int pageNumber) { PageInfo pageInfo = new PageInfo - .Builder(mPageSize, 0) - .setContentSize(mContentSize) + .Builder(mPageWidth, mPageHeight, pageNumber) + .setContentRect(mContentRect) .create(); - Page page = mDocument.startPage(pageInfo); - return page; + return startPage(pageInfo); } /** - * Finishes a started page. You should always finish the last started page. - * <p> - * <strong>Note:</strong> Do not call this method after {@link #close()}. - * </p> + * Gets the page width. * - * @param page The page. - * - * @see #startPage(int) + * @return The page width in PostScript points (1/72th of an inch). */ - public void finishPage(Page page) { - mDocument.finishPage(page); + public int getPageWidth() { + return mPageWidth; } /** - * Writes the document to an output stream. - * <p> - * <strong>Note:</strong> Do not call this method after {@link #close()}. - * </p> + * Gets the page height. * - * @param out The output stream. + * @return The page height in PostScript points (1/72th of an inch). */ - public void writeTo(OutputStream out) { - mDocument.writeTo(out); + public int getPageHeight() { + return mPageHeight; } /** - * Gets the pages of the document. + * Gets the content rectangle. This is the area of the page that + * contains printed data and is relative to the page top left. * - * @return The pages. - */ - public List<PageInfo> getPages() { - return mDocument.getPages(); - } - - /** - * Closes this document. This method should be called after you - * are done working with the document. After this call the document - * is considered closed and none of its methods should be called. + * @return The content rectangle. */ - public void close() { - mDocument.close(); + public Rect getPageContentRect() { + return mContentRect; } } diff --git a/core/java/android/printservice/package.html b/core/java/android/printservice/package.html index 7410a49..2fb06bd 100644 --- a/core/java/android/printservice/package.html +++ b/core/java/android/printservice/package.html @@ -4,12 +4,12 @@ Provides classes for implementing print services. Print services are plug-in components that know how to talk to printers via some standard protocols. These services serve as a bridge between the system and the printers. Hence, the printer and print protocol specific -implementation is factored out of the system and can by independently developed and updated. +implementation is factored out of the system and can be independently developed and updated. </p> <p> A print service implementation should extend {@link android.printservice.PrintService} and implement its abstract methods. Also the print service has to follow the contract for -managing print {@link android.printservice.PrintJob}s. +managing {@link android.printservice.PrintJob}s. <p/> <p> The system is responsible for starting and stopping a print service depending on whether diff --git a/core/jni/Android.mk b/core/jni/Android.mk index d5d746a..f78d807 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -118,6 +118,7 @@ LOCAL_SRC_FILES:= \ android/graphics/Utils.cpp \ android/graphics/Xfermode.cpp \ android/graphics/YuvToJpegEncoder.cpp \ + android/graphics/pdf/PdfDocument.cpp \ android_media_AudioRecord.cpp \ android_media_AudioSystem.cpp \ android_media_AudioTrack.cpp \ @@ -135,7 +136,6 @@ LOCAL_SRC_FILES:= \ android_util_FileObserver.cpp \ android/opengl/poly_clip.cpp.arm \ android/opengl/util.cpp.arm \ - android/print/android_print_pdf_PdfDocument.cpp \ android_server_NetworkManagementSocketTagger.cpp \ android_server_Watchdog.cpp \ android_ddm_DdmHandleNativeHeap.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 490d85c..8518101 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -117,6 +117,7 @@ extern int register_android_graphics_Rasterizer(JNIEnv* env); extern int register_android_graphics_Region(JNIEnv* env); extern int register_android_graphics_SurfaceTexture(JNIEnv* env); extern int register_android_graphics_Xfermode(JNIEnv* env); +extern int register_android_graphics_pdf_PdfDocument(JNIEnv* env); extern int register_android_view_DisplayEventReceiver(JNIEnv* env); extern int register_android_view_GraphicBuffer(JNIEnv* env); extern int register_android_view_GLES20DisplayList(JNIEnv* env); @@ -144,7 +145,6 @@ extern int register_android_os_FileObserver(JNIEnv *env); extern int register_android_os_FileUtils(JNIEnv *env); extern int register_android_os_UEventObserver(JNIEnv* env); extern int register_android_os_MemoryFile(JNIEnv* env); -extern int register_android_print_pdf_PdfDocument(JNIEnv* env); extern int register_android_net_LocalSocketImpl(JNIEnv* env); extern int register_android_net_NetworkUtils(JNIEnv* env); extern int register_android_net_TrafficStats(JNIEnv* env); @@ -1161,6 +1161,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_graphics_Typeface), REG_JNI(register_android_graphics_Xfermode), REG_JNI(register_android_graphics_YuvImage), + REG_JNI(register_android_graphics_pdf_PdfDocument), REG_JNI(register_android_database_CursorWindow), REG_JNI(register_android_database_SQLiteConnection), @@ -1173,7 +1174,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_SELinux), REG_JNI(register_android_os_Trace), REG_JNI(register_android_os_UEventObserver), - REG_JNI(register_android_print_pdf_PdfDocument), REG_JNI(register_android_net_LocalSocketImpl), REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), diff --git a/core/jni/android/print/android_print_pdf_PdfDocument.cpp b/core/jni/android/graphics/pdf/PdfDocument.cpp index 3daad5c..b57a0fe 100644 --- a/core/jni/android/print/android_print_pdf_PdfDocument.cpp +++ b/core/jni/android/graphics/pdf/PdfDocument.cpp @@ -28,6 +28,8 @@ namespace android { +#define LOGD(x...) do { Log::Instance()->printf(Log::ELogD, x); } while(0) + static jint nativeCreateDocument(JNIEnv* env, jobject clazz) { return reinterpret_cast<jint>(new SkPDFDocument()); } @@ -36,21 +38,16 @@ static void nativeFinalize(JNIEnv* env, jobject thiz, jint documentPtr) { delete reinterpret_cast<SkPDFDocument*>(documentPtr); } -static jint nativeCreatePage(JNIEnv* env, jobject thiz, - jobject pageSize, jobject contentSize, jint initialTransformation) { - SkIRect skPageSizeRect; - GraphicsJNI::jrect_to_irect(env, pageSize, &skPageSizeRect); - SkISize skPageSize = SkISize::Make(skPageSizeRect.width(), - skPageSizeRect.height()); +static jint nativeCreatePage(JNIEnv* env, jobject thiz, jint pageWidth, jint pageHeight, + jint contentLeft, jint contentTop, jint contentRight, jint contentBottom) { - SkIRect skContentRect; - GraphicsJNI::jrect_to_irect(env, contentSize, &skContentRect); - SkISize skContentSize = SkISize::Make(skContentRect.width(), - skContentRect.height()); + SkMatrix transformation; + transformation.setTranslate(contentLeft, contentTop); - SkMatrix* transformation = reinterpret_cast<SkMatrix*>(initialTransformation); - SkPDFDevice* skPdfDevice = new SkPDFDevice(skPageSize, skContentSize, *transformation); + SkISize skPageSize = SkISize::Make(pageWidth, pageHeight); + SkISize skContentSize = SkISize::Make(contentRight - contentLeft, contentBottom - contentTop); + SkPDFDevice* skPdfDevice = new SkPDFDevice(skPageSize, skContentSize, transformation); return reinterpret_cast<jint>(new SkCanvas(skPdfDevice)); } @@ -72,15 +69,15 @@ static void nativeWriteTo(JNIEnv* env, jobject clazz, jint documentPtr, static JNINativeMethod gPdfDocument_Methods[] = { {"nativeCreateDocument", "()I", (void*) nativeCreateDocument}, {"nativeFinalize", "(I)V", (void*) nativeFinalize}, - {"nativeCreatePage", "(Landroid/graphics/Rect;Landroid/graphics/Rect;I)I", + {"nativeCreatePage", "(IIIIII)I", (void*) nativeCreatePage}, {"nativeAppendPage", "(II)V", (void*) nativeAppendPage}, {"nativeWriteTo", "(ILjava/io/OutputStream;[B)V", (void*) nativeWriteTo} }; -int register_android_print_pdf_PdfDocument(JNIEnv* env) { +int register_android_graphics_pdf_PdfDocument(JNIEnv* env) { int result = android::AndroidRuntime::registerNativeMethods( - env, "android/print/pdf/PdfDocument", gPdfDocument_Methods, + env, "android/graphics/pdf/PdfDocument", gPdfDocument_Methods, NELEM(gPdfDocument_Methods)); return result; } diff --git a/core/java/android/print/pdf/PdfDocument.java b/graphics/java/android/graphics/pdf/PdfDocument.java index a2883cf..066ae2b 100644 --- a/core/java/android/print/pdf/PdfDocument.java +++ b/graphics/java/android/graphics/pdf/PdfDocument.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package android.print.pdf; +package android.graphics.pdf; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Matrix; import android.graphics.Rect; import dalvik.system.CloseGuard; +import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; @@ -34,14 +34,16 @@ import java.util.List; * open a new document and then for every page you want to add you start a page, * write content to the page, and finish the page. After you are done with all * pages, you write the document to an output stream and close the document. - * After a document is closed you should not use it anymore. + * After a document is closed you should not use it anymore. Note that pages are + * created one by one, i.e. you can have only a single page to which you are + * writing at any given time. This class is not thread safe. * </p> * <p> * A typical use of the APIs looks like this: * </p> * <pre> - * // open a new document - * PdfDocument document = PdfDocument.open(); + * // create a new document + * PdfDocument document = new PdfDocument(); * * // crate a page description * PageInfo pageInfo = new PageInfo.Builder(new Rect(0, 0, 100, 100), 1).create(); @@ -65,7 +67,7 @@ import java.util.List; * document.close(); * </pre> */ -public final class PdfDocument { +public class PdfDocument { private final byte[] mChunk = new byte[4096]; @@ -78,24 +80,9 @@ public final class PdfDocument { private Page mCurrentPage; /** - * Opens a new document. - * <p> - * <strong>Note:</strong> You must close the document after you are - * done by calling {@link #close()} - * </p> - * - * @return The document. - * - * @see #close() - */ - public static PdfDocument open() { - return new PdfDocument(); - } - - /** * Creates a new instance. */ - private PdfDocument() { + public PdfDocument() { mNativeDocument = nativeCreateDocument(); mCloseGuard.open("close"); } @@ -109,23 +96,24 @@ public final class PdfDocument { * no longer access the page or its canvas. * <p> * <strong>Note:</strong> Do not call this method after {@link #close()}. + * Also do not call this method if the last page returned by this method + * is not finished by calling {@link #finishPage(Page)}. * </p> * - * @param pageInfo The page info. + * @param pageInfo The page info. Cannot be null. * @return A blank page. * * @see #finishPage(Page) */ public Page startPage(PageInfo pageInfo) { throwIfClosed(); + throwIfCurrentPageNotFinished(); if (pageInfo == null) { - throw new IllegalArgumentException("page cannot be null!"); - } - if (mCurrentPage != null) { - throw new IllegalStateException("Previous page not finished!"); + throw new IllegalArgumentException("page cannot be null"); } - Canvas canvas = new PdfCanvas(nativeCreatePage(pageInfo.mPageSize, - pageInfo.mContentSize, pageInfo.mInitialTransform.native_instance)); + Canvas canvas = new PdfCanvas(nativeCreatePage(pageInfo.mPageWidth, + pageInfo.mPageHeight, pageInfo.mContentRect.left, pageInfo.mContentRect.top, + pageInfo.mContentRect.right, pageInfo.mContentRect.bottom)); mCurrentPage = new Page(canvas, pageInfo); return mCurrentPage; } @@ -134,9 +122,10 @@ public final class PdfDocument { * Finishes a started page. You should always finish the last started page. * <p> * <strong>Note:</strong> Do not call this method after {@link #close()}. + * You should not finish the same page more than once. * </p> * - * @param page The page. + * @param page The page. Cannot be null. * * @see #startPage(PageInfo) */ @@ -148,6 +137,9 @@ public final class PdfDocument { if (page != mCurrentPage) { throw new IllegalStateException("invalid page"); } + if (page.isFinished()) { + throw new IllegalStateException("page already finished"); + } mPages.add(page.getInfo()); mCurrentPage = null; nativeAppendPage(mNativeDocument, page.mCanvas.mNativeCanvas); @@ -155,15 +147,21 @@ public final class PdfDocument { } /** - * Writes the document to an output stream. + * Writes the document to an output stream. You can call this method + * multiple times. * <p> * <strong>Note:</strong> Do not call this method after {@link #close()}. + * Also do not call this method if a page returned by {@link #startPage( + * PageInfo)} is not finished by calling {@link #finishPage(Page)}. * </p> * - * @param out The output stream. + * @param out The output stream. Cannot be null. + * + * @throws IOException If an error occurs while writing. */ - public void writeTo(OutputStream out) { + public void writeTo(OutputStream out) throws IOException { throwIfClosed(); + throwIfCurrentPageNotFinished(); if (out == null) { throw new IllegalArgumentException("out cannot be null!"); } @@ -173,7 +171,7 @@ public final class PdfDocument { /** * Gets the pages of the document. * - * @return The pages. + * @return The pages or an empty list. */ public List<PageInfo> getPages() { return Collections.unmodifiableList(mPages); @@ -183,8 +181,14 @@ public final class PdfDocument { * Closes this document. This method should be called after you * are done working with the document. After this call the document * is considered closed and none of its methods should be called. + * <p> + * <strong>Note:</strong> Do not call this method if the page + * returned by {@link #startPage(PageInfo)} is not finished by + * calling {@link #finishPage(Page)}. + * </p> */ public void close() { + throwIfCurrentPageNotFinished(); dispose(); } @@ -215,6 +219,15 @@ public final class PdfDocument { } } + /** + * Throws an exception if the last started page is not finished. + */ + private void throwIfCurrentPageNotFinished() { + if (mCurrentPage != null) { + throw new IllegalStateException("Current page not finished!"); + } + } + private native int nativeCreateDocument(); private native void nativeFinalize(int document); @@ -223,9 +236,8 @@ public final class PdfDocument { private native void nativeWriteTo(int document, OutputStream out, byte[] chunk); - private static native int nativeCreatePage(Rect pageSize, - Rect contentSize, int nativeMatrix); - + private static native int nativeCreatePage(int pageWidth, int pageHeight, int contentLeft, + int contentTop, int contentRight, int contentBottom); private final class PdfCanvas extends Canvas { @@ -243,9 +255,9 @@ public final class PdfDocument { * This class represents meta-data that describes a PDF {@link Page}. */ public static final class PageInfo { - private Rect mPageSize; - private Rect mContentSize; - private Matrix mInitialTransform; + private int mPageWidth; + private int mPageHeight; + private Rect mContentRect; private int mPageNumber; /** @@ -256,32 +268,32 @@ public final class PdfDocument { } /** - * Gets the page size in PostScript points (1/72th of an inch). + * Gets the page width in PostScript points (1/72th of an inch). * - * @return The page size. + * @return The page width. */ - public Rect getPageSize() { - return mPageSize; + public int getPageWidth() { + return mPageWidth; } /** - * Get the content size in PostScript points (1/72th of an inch). + * Gets the page height in PostScript points (1/72th of an inch). * - * @return The content size. + * @return The page height. */ - public Rect getContentSize() { - return mContentSize; + public int getPageHeight() { + return mPageHeight; } /** - * Gets the initial transform which is applied to the page. This may be - * useful to move the origin to account for a margin, apply scale, or - * apply a rotation. + * Get the content rectangle in PostScript points (1/72th of an inch). + * This is the area that contains the page content and is relative to + * the page top left. * - * @return The initial transform. + * @return The content rectangle. */ - public Matrix getInitialTransform() { - return mInitialTransform; + public Rect getContentRect() { + return mContentRect; } /** @@ -302,47 +314,40 @@ public final class PdfDocument { /** * Creates a new builder with the mandatory page info attributes. * - * @param pageSize The page size in PostScript (1/72th of an inch). + * @param pageWidth The page width in PostScript (1/72th of an inch). + * @param pageHeight The page height in PostScript (1/72th of an inch). * @param pageNumber The page number. */ - public Builder(Rect pageSize, int pageNumber) { - if (pageSize.width() == 0 || pageSize.height() == 0) { - throw new IllegalArgumentException("page width and height" + - " must be greater than zero!"); + public Builder(int pageWidth, int pageHeight, int pageNumber) { + if (pageWidth <= 0) { + throw new IllegalArgumentException("page width must be positive"); + } + if (pageHeight <= 0) { + throw new IllegalArgumentException("page width must be positive"); } if (pageNumber < 0) { - throw new IllegalArgumentException("pageNumber cannot be less than zero!"); + throw new IllegalArgumentException("pageNumber must be non negative"); } - mPageInfo.mPageSize = pageSize; + mPageInfo.mPageWidth = pageWidth; + mPageInfo.mPageHeight = pageHeight; mPageInfo.mPageNumber = pageNumber; } /** - * Sets the content size in PostScript point (1/72th of an inch). + * Sets the content rectangle in PostScript point (1/72th of an inch). + * This is the area that contains the page content and is relative to + * the page top left. * - * @param contentSize The content size. + * @param contentRect The content rectangle. Must fit in the page. */ - public Builder setContentSize(Rect contentSize) { - Rect pageSize = mPageInfo.mPageSize; - if (contentSize != null && (pageSize.left > contentSize.left - || pageSize.top > contentSize.top - || pageSize.right < contentSize.right - || pageSize.bottom < contentSize.bottom)) { - throw new IllegalArgumentException("contentSize does not fit the pageSize!"); + public Builder setContentRect(Rect contentRect) { + if (contentRect != null && (contentRect.left < 0 + || contentRect.top < 0 + || contentRect.right > mPageInfo.mPageWidth + || contentRect.bottom > mPageInfo.mPageHeight)) { + throw new IllegalArgumentException("contentRect does not fit the page"); } - mPageInfo.mContentSize = contentSize; - return this; - } - - /** - * Sets the initial transform which is applied to the page. This may be - * useful to move the origin to account for a margin, apply scale, or - * apply a rotation. - * - * @param transform The initial transform. - */ - public Builder setInitialTransform(Matrix transform) { - mPageInfo.mInitialTransform = transform; + mPageInfo.mContentRect = contentRect; return this; } @@ -352,11 +357,9 @@ public final class PdfDocument { * @return The new instance. */ public PageInfo create() { - if (mPageInfo.mContentSize == null) { - mPageInfo.mContentSize = mPageInfo.mPageSize; - } - if (mPageInfo.mInitialTransform == null) { - mPageInfo.mInitialTransform = new Matrix(); + if (mPageInfo.mContentRect == null) { + mPageInfo.mContentRect = new Rect(0, 0, + mPageInfo.mPageWidth, mPageInfo.mPageHeight); } return mPageInfo; } @@ -367,7 +370,8 @@ public final class PdfDocument { * This class represents a PDF document page. It has associated * a canvas on which you can draw content and is acquired by a * call to {@link #getCanvas()}. It also has associated a - * {@link PageInfo} instance that describes its attributes. + * {@link PageInfo} instance that describes its attributes. Also + * a page has */ public static final class Page { private final PageInfo mPageInfo; @@ -406,6 +410,10 @@ public final class PdfDocument { return mPageInfo; } + boolean isFinished() { + return mCanvas == null; + } + private void finish() { if (mCanvas != null) { mCanvas.release(); diff --git a/graphics/java/android/graphics/pdf/package.html b/graphics/java/android/graphics/pdf/package.html new file mode 100644 index 0000000..51f2460 --- /dev/null +++ b/graphics/java/android/graphics/pdf/package.html @@ -0,0 +1,5 @@ +<HTML> +<BODY> +Contains classes for manipulation of PDF content. +</BODY> +</HTML>
\ No newline at end of file diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 34e87cc..af1c60e 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -358,7 +358,7 @@ public class PrintJobConfigActivity extends Activity { PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( mPrintJobId, mCurrPrintAttributes); - mMetadata.putBoolean(PrintDocumentAdapter.METADATA_KEY_PRINT_PREVIEW, + mMetadata.putBoolean(PrintDocumentAdapter.EXTRA_PRINT_PREVIEW, !mEditor.isPrintConfirmed()); mControllerState = CONTROLLER_STATE_LAYOUT_STARTED; |