aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2013-07-30 17:17:44 -0700
committerSvetoslav Ganov <svetoslavganov@google.com>2013-07-30 17:17:44 -0700
commitecaec06dfbaa011676c37f5f6170b984da5c6a5e (patch)
tree410195929a93262866c8586efc4f4575cfdb2d8f
parentc6c630d5c2b70440d433aa19bcf50c115d9cf39a (diff)
downloadexperimental-ecaec06dfbaa011676c37f5f6170b984da5c6a5e.tar.gz
Update samples due for framework changes
Change-Id: I08f6b93eb7273e2aff9249dfa54c8532fe15d111
-rw-r--r--PrintApp/src/foo/bar/print/PrintActivity.java151
-rw-r--r--PrintApp/src/foo/bar/print/PrintedPdfDocument.java6
-rw-r--r--PrintService/src/foo/bar/printservice/MyPrintService.java27
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()) {