diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2013-07-30 17:17:44 -0700 |
---|---|---|
committer | Svetoslav Ganov <svetoslavganov@google.com> | 2013-07-30 17:17:44 -0700 |
commit | ecaec06dfbaa011676c37f5f6170b984da5c6a5e (patch) | |
tree | 410195929a93262866c8586efc4f4575cfdb2d8f | |
parent | c6c630d5c2b70440d433aa19bcf50c115d9cf39a (diff) | |
download | experimental-ecaec06dfbaa011676c37f5f6170b984da5c6a5e.tar.gz |
Update samples due for framework changes
Change-Id: I08f6b93eb7273e2aff9249dfa54c8532fe15d111
-rw-r--r-- | PrintApp/src/foo/bar/print/PrintActivity.java | 151 | ||||
-rw-r--r-- | PrintApp/src/foo/bar/print/PrintedPdfDocument.java | 6 | ||||
-rw-r--r-- | PrintService/src/foo/bar/printservice/MyPrintService.java | 27 |
3 files changed, 135 insertions, 49 deletions
diff --git a/PrintApp/src/foo/bar/print/PrintActivity.java b/PrintApp/src/foo/bar/print/PrintActivity.java index dfd339b..893b3b5 100644 --- a/PrintApp/src/foo/bar/print/PrintActivity.java +++ b/PrintApp/src/foo/bar/print/PrintActivity.java @@ -30,6 +30,7 @@ import android.print.PrintJob; import android.print.PrintManager; import android.print.pdf.PdfDocument.Page; import android.util.Log; +import android.util.SparseIntArray; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -37,10 +38,10 @@ import android.view.View; import java.io.File; import java.io.FileDescriptor; import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import libcore.io.IoUtils; - /** * Simple sample of how to use the print APIs. */ @@ -48,6 +49,8 @@ public class PrintActivity extends Activity { public static final String LOG_TAG = "PrintActivity"; + private final Object mLock = new Object(); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -83,6 +86,7 @@ public class PrintActivity extends Activity { } private void printView() { + PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); final View view = findViewById(R.id.content); @@ -90,6 +94,7 @@ public class PrintActivity extends Activity { PrintJob printJob = printManager.print("Print_View", new PrintDocumentAdapter() { private PrintedPdfDocument mPdfDocument; + private boolean mCancelled; @Override public void onStart() { @@ -101,57 +106,121 @@ public class PrintActivity extends Activity { public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle metadata) { - Log.i(LOG_TAG, "onLayout"); + Log.i(LOG_TAG, "onLayout[oldAttributes: " + oldAttributes + + ", newAttributes: " + newAttributes + "] preview: " + + metadata.getBoolean(PrintDocumentAdapter.METADATA_KEY_PRINT_PREVIEW)); mPdfDocument = new PrintedPdfDocument(PrintActivity.this, newAttributes); - Page page = mPdfDocument.startPage(); - view.draw(page.getCanvas()); - mPdfDocument.finishPage(page); - - PrintDocumentInfo info = new PrintDocumentInfo.Builder() - .setPageCount(1) - .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) - .create(); - callback.onLayoutFinished(info, false); + + final boolean cancelled; + synchronized (mLock) { + mCancelled = false; + try { + mLock.wait(5000); + } catch (InterruptedException ie) { + mCancelled = true; + } + cancelled = mCancelled; + } + + if (cancelled) { + mPdfDocument.close(); + mPdfDocument = null; + callback.onLayoutCancelled(); + } else { + PrintDocumentInfo info = new PrintDocumentInfo.Builder() + .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) + .setPageCount(5) + .create(); + callback.onLayoutFinished(info, false); + } + + cancellationSignal.setOnCancelListener(new OnCancelListener() { + @Override + public void onCancel() { + Log.i(LOG_TAG, "onLayout#onCancel()"); + synchronized (mLock) { + mCancelled = true; + mLock.notifyAll(); + } + } + }); } @Override - public void onWrite(final List<PageRange> pages, - final FileDescriptor destination, + public void onWrite(final PageRange[] pages, final FileDescriptor destination, final CancellationSignal canclleationSignal, final WriteResultCallback callback) { - Log.i(LOG_TAG, "onWrite"); + Log.i(LOG_TAG, "onWrite[pages: " + Arrays.toString(pages) +"]"); + + final SparseIntArray writtenPagesArray = new SparseIntArray(); final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - try { - mPdfDocument.writeTo(new FileOutputStream(destination)); - } finally { - mPdfDocument.close(); - IoUtils.closeQuietly(destination); + @Override + protected void onPreExecute() { + synchronized (mLock) { + for (int i = 0; i < 5; i++) { + try { + mLock.wait(1000); + } catch (InterruptedException ie) { + /* ignore */ + } + if (isCancelled()) { + mPdfDocument.close(); + mPdfDocument = null; + callback.onWriteCancelled(); + break; + } + if (containsPage(pages, i)) { + writtenPagesArray.append(writtenPagesArray.size(), i); + Page page = mPdfDocument.startPage(); + view.draw(page.getCanvas()); + mPdfDocument.finishPage(page); + } + } } - return null; } @Override - protected void onPostExecute(Void result) { - callback.onWriteFinished(pages); - } + protected Void doInBackground(Void... params) { + mPdfDocument.writeTo(new FileOutputStream(destination)); + mPdfDocument.close(); + mPdfDocument = null; + + List<PageRange> pageRanges = new ArrayList<PageRange>(); + + int start = -1; + int end = -1; + final int writtenPageCount = writtenPagesArray.size(); + for (int i = 0; i < writtenPageCount; i++) { + if (start < 0) { + start = writtenPagesArray.valueAt(i); + } + int oldEnd = end = start; + while (i < writtenPageCount && (end - oldEnd) <= 1) { + oldEnd = end; + end = writtenPagesArray.valueAt(i); + i++; + } + PageRange pageRange = new PageRange(start, end); + pageRanges.add(pageRange); + start = end = -1; + } + + PageRange[] writtenPages = new PageRange[pageRanges.size()]; + pageRanges.toArray(writtenPages); + callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); + return null; + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); - @Override - protected void onCancelled(Void result) { - callback.onWriteFailed("Cancelled"); - } - }; - canclleationSignal.setOnCancelListener(new OnCancelListener() { @Override public void onCancel() { + Log.i(LOG_TAG, "onWrite#onCancel()"); task.cancel(true); - } + mLock.notifyAll(); + } }); - - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); } @Override @@ -159,6 +228,18 @@ public class PrintActivity extends Activity { Log.i(LOG_TAG, "onFinish"); super.onFinish(); } + + private boolean containsPage(PageRange[] pageRanges, int page) { + final int pageRangeCount = pageRanges.length; + for (int i = 0; i < pageRangeCount; i++) { + if (pageRanges[i].getStart() <= page + && pageRanges[i].getEnd() >= page) { + return true; + } + } + return false; + } + }, new PrintAttributes.Builder().create()); if (printJob != null) { diff --git a/PrintApp/src/foo/bar/print/PrintedPdfDocument.java b/PrintApp/src/foo/bar/print/PrintedPdfDocument.java index f6cdb4a..0755d43 100644 --- a/PrintApp/src/foo/bar/print/PrintedPdfDocument.java +++ b/PrintApp/src/foo/bar/print/PrintedPdfDocument.java @@ -29,6 +29,7 @@ import android.print.pdf.PdfDocument; import android.print.pdf.PdfDocument.Page; import android.print.pdf.PdfDocument.PageInfo; import android.util.DisplayMetrics; +import android.util.Log; import android.view.Display; import java.io.OutputStream; @@ -71,8 +72,13 @@ public final class PrintedPdfDocument { Resolution resolution = attributes.getResolution(); // TODO: What to do if horizontal and vertical DPI differ? + try { mCanvasDensityDpi = Math.max(attributes.getResolution().getHorizontalDpi(), attributes .getResolution().getVerticalDpi()); + } catch (NullPointerException npe) { + Log.i("FUCK", "FUCK"); + throw new RuntimeException(npe); + } // Figure out the scale since the content and the target DPI may differ. DisplayMetrics metrics = new DisplayMetrics(); diff --git a/PrintService/src/foo/bar/printservice/MyPrintService.java b/PrintService/src/foo/bar/printservice/MyPrintService.java index a1f809c..5bb6661 100644 --- a/PrintService/src/foo/bar/printservice/MyPrintService.java +++ b/PrintService/src/foo/bar/printservice/MyPrintService.java @@ -6,6 +6,7 @@ import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.SystemClock; import android.print.PrintAttributes; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; @@ -19,6 +20,8 @@ import android.printservice.PrintService; import android.util.Log; import android.widget.Toast; +import libcore.io.IoUtils; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -91,18 +94,8 @@ public class MyPrintService extends PrintService { } catch (IOException ioe) { /* ignore */ } finally { - try { - in.close(); - } catch (IOException ioe) { - /* ignore */ - } - if (out != null) { - try { - out.close(); - } catch (IOException ioe) { - /* ignore */ - } - } + IoUtils.closeQuietly(in); + IoUtils.closeQuietly(out); } return null; } @@ -123,9 +116,15 @@ public class MyPrintService extends PrintService { } PrintJobInfo info = printJob.getInfo(); + + Toast.makeText(MyPrintService.this, + "[STARTED] Printer: " + info.getPrinterId().getLocalId(), + Toast.LENGTH_SHORT).show(); + + SystemClock.sleep(5000); + Toast.makeText(MyPrintService.this, - "Printer: " + info.getPrinterId().getLocalId() - + " copies: " + info.getAttributes().getCopies(), + "[COMPLETED] Printer: " + info.getPrinterId().getLocalId(), Toast.LENGTH_SHORT).show(); if (printJob.isStarted()) { |