summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/android/jni/mupdf.c91
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/CancellableAsyncTask.java79
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/CancellableTaskDefinition.java8
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/MuPDFCancellableTaskDefinition.java38
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/MuPDFCore.java43
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java31
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/PageView.java92
7 files changed, 303 insertions, 79 deletions
diff --git a/platform/android/jni/mupdf.c b/platform/android/jni/mupdf.c
index 53cb7b3a..c7965702 100644
--- a/platform/android/jni/mupdf.c
+++ b/platform/android/jni/mupdf.c
@@ -623,7 +623,7 @@ static void update_changed_rects(globals *glo, page_cache *pc, pdf_document *ido
JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
- int pageW, int pageH, int patchX, int patchY, int patchW, int patchH)
+ int pageW, int pageH, int patchX, int patchY, int patchW, int patchH, jlong cookiePtr)
{
AndroidBitmapInfo info;
void *pixels;
@@ -641,6 +641,7 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
page_cache *pc = &glo->pages[glo->current];
int hq = (patchW < pageW || patchH < pageH);
fz_matrix scale;
+ fz_cookie *cookie = (fz_cookie *)(unsigned int)cookiePtr;
if (pc->page == NULL)
return 0;
@@ -690,9 +691,15 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
/* Render to list */
pc->page_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->page_list);
- fz_run_page_contents(doc, pc->page, dev, &fz_identity, NULL);
+ fz_run_page_contents(doc, pc->page, dev, &fz_identity, cookie);
fz_free_device(dev);
dev = NULL;
+ if (cookie != NULL && cookie->abort)
+ {
+ fz_drop_display_list(ctx, pc->page_list);
+ pc->page_list = NULL;
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+ }
}
if (pc->annot_list == NULL)
{
@@ -700,9 +707,15 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
pc->annot_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->annot_list);
for (annot = fz_first_annot(doc, pc->page); annot; annot = fz_next_annot(doc, annot))
- fz_run_annot(doc, pc->page, annot, dev, &fz_identity, NULL);
+ fz_run_annot(doc, pc->page, annot, dev, &fz_identity, cookie);
fz_free_device(dev);
dev = NULL;
+ if (cookie != NULL && cookie->abort)
+ {
+ fz_drop_display_list(ctx, pc->annot_list);
+ pc->annot_list = NULL;
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+ }
}
bbox.x0 = patchX;
bbox.y0 = patchY;
@@ -742,9 +755,15 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
for (i=0; i<100;i++) {
#endif
if (pc->page_list)
- fz_run_display_list(pc->page_list, dev, &ctm, &rect, NULL);
+ fz_run_display_list(pc->page_list, dev, &ctm, &rect, cookie);
+ if (cookie != NULL && cookie->abort)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+
if (pc->annot_list)
- fz_run_display_list(pc->annot_list, dev, &ctm, &rect, NULL);
+ fz_run_display_list(pc->annot_list, dev, &ctm, &rect, cookie);
+ if (cookie != NULL && cookie->abort)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+
#ifdef TIME_DISPLAY_LIST
}
time = clock() - time;
@@ -787,7 +806,7 @@ static char *widget_type_string(int t)
}
JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap, int page,
- int pageW, int pageH, int patchX, int patchY, int patchW, int patchH)
+ int pageW, int pageH, int patchX, int patchY, int patchW, int patchH, jlong cookiePtr)
{
AndroidBitmapInfo info;
void *pixels;
@@ -808,6 +827,7 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
fz_document *doc = glo->doc;
rect_node *crect;
fz_matrix scale;
+ fz_cookie *cookie = (fz_cookie *)(unsigned int)cookiePtr;
for (i = 0; i < NUM_CACHE; i++)
{
@@ -823,7 +843,7 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
/* Without a cached page object we cannot perform a partial update so
render the entire bitmap instead */
JNI_FN(MuPDFCore_gotoPageInternal)(env, thiz, page);
- return JNI_FN(MuPDFCore_drawPage)(env, thiz, bitmap, pageW, pageH, patchX, patchY, patchW, patchH);
+ return JNI_FN(MuPDFCore_drawPage)(env, thiz, bitmap, pageW, pageH, patchX, patchY, patchW, patchH, (jlong)(unsigned int)cookie);
}
idoc = pdf_specifics(doc);
@@ -869,18 +889,30 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
/* Render to list */
pc->page_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->page_list);
- fz_run_page_contents(doc, pc->page, dev, &fz_identity, NULL);
+ fz_run_page_contents(doc, pc->page, dev, &fz_identity, cookie);
fz_free_device(dev);
dev = NULL;
+ if (cookie != NULL && cookie->abort)
+ {
+ fz_drop_display_list(ctx, pc->page_list);
+ pc->page_list = NULL;
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+ }
}
if (pc->annot_list == NULL) {
pc->annot_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->annot_list);
for (annot = fz_first_annot(doc, pc->page); annot; annot = fz_next_annot(doc, annot))
- fz_run_annot(doc, pc->page, annot, dev, &fz_identity, NULL);
+ fz_run_annot(doc, pc->page, annot, dev, &fz_identity, cookie);
fz_free_device(dev);
dev = NULL;
+ if (cookie != NULL && cookie->abort)
+ {
+ fz_drop_display_list(ctx, pc->annot_list);
+ pc->annot_list = NULL;
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+ }
}
bbox.x0 = patchX;
@@ -920,9 +952,15 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
fz_clear_pixmap_rect_with_value(ctx, pix, 0xff, &abox);
dev = fz_new_draw_device_with_bbox(ctx, pix, &abox);
if (pc->page_list)
- fz_run_display_list(pc->page_list, dev, &ctm, &arect, NULL);
+ fz_run_display_list(pc->page_list, dev, &ctm, &arect, cookie);
+ if (cookie != NULL && cookie->abort)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+
if (pc->annot_list)
- fz_run_display_list(pc->annot_list, dev, &ctm, &arect, NULL);
+ fz_run_display_list(pc->annot_list, dev, &ctm, &arect, cookie);
+ if (cookie != NULL && cookie->abort)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
+
fz_free_device(dev);
dev = NULL;
}
@@ -2550,3 +2588,34 @@ JNI_FN(MuPDFCore_dumpMemoryInternal)(JNIEnv * env, jobject thiz)
LOGE("dumpMemoryInternal end");
#endif
}
+
+JNIEXPORT jlong JNICALL
+JNI_FN(MuPDFCore_createCookie)(JNIEnv * env, jobject thiz)
+{
+ globals *glo = get_globals(env, thiz);
+ if (glo == NULL)
+ return 0;
+ fz_context *ctx = glo->ctx;
+
+ return (jlong) (unsigned int) fz_calloc_no_throw(ctx,1, sizeof(fz_cookie));
+}
+
+JNIEXPORT void JNICALL
+JNI_FN(MuPDFCore_destroyCookie)(JNIEnv * env, jobject thiz, jlong cookiePtr)
+{
+ fz_cookie *cookie = (fz_cookie *) (unsigned int) cookiePtr;
+ globals *glo = get_globals(env, thiz);
+ if (glo == NULL)
+ return;
+ fz_context *ctx = glo->ctx;
+
+ fz_free(ctx, cookie);
+}
+
+JNIEXPORT void JNICALL
+JNI_FN(MuPDFCore_abortCookie)(JNIEnv * env, jobject thiz, jlong cookiePtr)
+{
+ fz_cookie *cookie = (fz_cookie *) (unsigned int) cookiePtr;
+ if (cookie != NULL)
+ cookie->abort = 1;
+}
diff --git a/platform/android/src/com/artifex/mupdfdemo/CancellableAsyncTask.java b/platform/android/src/com/artifex/mupdfdemo/CancellableAsyncTask.java
new file mode 100644
index 00000000..fcb1b744
--- /dev/null
+++ b/platform/android/src/com/artifex/mupdfdemo/CancellableAsyncTask.java
@@ -0,0 +1,79 @@
+package com.artifex.mupdfdemo;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+
+// Ideally this would be a subclass of AsyncTask, however the cancel() method is final, and cannot
+// be overridden. I felt that having two different, but similar cancel methods was a bad idea.
+public class CancellableAsyncTask<Params, Result>
+{
+ private final AsyncTask<Params, Void, Result> asyncTask;
+ private final CancellableTaskDefinition<Params, Result> ourTask;
+
+ public void onPreExecute()
+ {
+
+ }
+
+ public void onPostExecute(Result result)
+ {
+
+ }
+
+ public CancellableAsyncTask(final CancellableTaskDefinition<Params, Result> task)
+ {
+ if (task == null)
+ throw new IllegalArgumentException();
+
+ this.ourTask = task;
+ asyncTask = new AsyncTask<Params, Void, Result>()
+ {
+ @Override
+ protected Result doInBackground(Params... params)
+ {
+ return task.doInBackground(params);
+ }
+
+ @Override
+ protected void onPreExecute()
+ {
+ CancellableAsyncTask.this.onPreExecute();
+ }
+
+ @Override
+ protected void onPostExecute(Result result)
+ {
+ CancellableAsyncTask.this.onPostExecute(result);
+ task.doCleanup();
+ }
+ };
+ }
+
+ public void cancelAndWait()
+ {
+ this.asyncTask.cancel(true);
+ ourTask.doCancel();
+
+ try
+ {
+ this.asyncTask.get();
+ }
+ catch (InterruptedException e)
+ {
+ }
+ catch (ExecutionException e)
+ {
+ }
+ catch (CancellationException e)
+ {
+ }
+
+ ourTask.doCleanup();
+ }
+
+ public void execute(Params ... params)
+ {
+ asyncTask.execute(params);
+ }
+
+}
diff --git a/platform/android/src/com/artifex/mupdfdemo/CancellableTaskDefinition.java b/platform/android/src/com/artifex/mupdfdemo/CancellableTaskDefinition.java
new file mode 100644
index 00000000..62b04f30
--- /dev/null
+++ b/platform/android/src/com/artifex/mupdfdemo/CancellableTaskDefinition.java
@@ -0,0 +1,8 @@
+package com.artifex.mupdfdemo;
+
+public interface CancellableTaskDefinition <Params, Result>
+{
+ public Result doInBackground(Params ... params);
+ public void doCancel();
+ public void doCleanup();
+}
diff --git a/platform/android/src/com/artifex/mupdfdemo/MuPDFCancellableTaskDefinition.java b/platform/android/src/com/artifex/mupdfdemo/MuPDFCancellableTaskDefinition.java
new file mode 100644
index 00000000..b95d8e93
--- /dev/null
+++ b/platform/android/src/com/artifex/mupdfdemo/MuPDFCancellableTaskDefinition.java
@@ -0,0 +1,38 @@
+package com.artifex.mupdfdemo;
+
+public abstract class MuPDFCancellableTaskDefinition<Params, Result> implements CancellableTaskDefinition<Params, Result>
+{
+ private MuPDFCore.Cookie cookie;
+
+ public MuPDFCancellableTaskDefinition(MuPDFCore core)
+ {
+ this.cookie = core.new Cookie();
+ }
+
+ @Override
+ public void doCancel()
+ {
+ if (cookie == null)
+ return;
+
+ cookie.abort();
+ }
+
+ @Override
+ public void doCleanup()
+ {
+ if (cookie == null)
+ return;
+
+ cookie.destroy();
+ cookie = null;
+ }
+
+ @Override
+ public final Result doInBackground(Params ... params)
+ {
+ return doInBackground(cookie, params);
+ }
+
+ public abstract Result doInBackground(MuPDFCore.Cookie cookie, Params ... params);
+}
diff --git a/platform/android/src/com/artifex/mupdfdemo/MuPDFCore.java b/platform/android/src/com/artifex/mupdfdemo/MuPDFCore.java
index ecdeccc7..ec35ef7c 100644
--- a/platform/android/src/com/artifex/mupdfdemo/MuPDFCore.java
+++ b/platform/android/src/com/artifex/mupdfdemo/MuPDFCore.java
@@ -33,12 +33,14 @@ public class MuPDFCore
private native void drawPage(Bitmap bitmap,
int pageW, int pageH,
int patchX, int patchY,
- int patchW, int patchH);
+ int patchW, int patchH,
+ long cookiePtr);
private native void updatePageInternal(Bitmap bitmap,
int page,
int pageW, int pageH,
int patchX, int patchY,
- int patchW, int patchH);
+ int patchW, int patchH,
+ long cookiePtr);
private native RectF[] searchPage(String text);
private native TextChar[][][][] text();
private native byte[] textAsHtml();
@@ -69,9 +71,36 @@ public class MuPDFCore
private native void destroying();
private native boolean hasChangesInternal();
private native void saveInternal();
+ private native long createCookie();
+ private native void destroyCookie(long cookie);
+ private native void abortCookie(long cookie);
public native boolean javascriptSupported();
+ public class Cookie
+ {
+ private final long cookiePtr;
+
+ public Cookie()
+ {
+ cookiePtr = createCookie();
+ if (cookiePtr == 0)
+ throw new OutOfMemoryError();
+ }
+
+ public void abort()
+ {
+ abortCookie(cookiePtr);
+ }
+
+ public void destroy()
+ {
+ // We could do this in finalize, but there's no guarantee that
+ // a finalize will occur before the muPDF context occurs.
+ destroyCookie(cookiePtr);
+ }
+ }
+
public MuPDFCore(Context context, String filename) throws Exception
{
globals = openFile(filename);
@@ -152,16 +181,18 @@ public class MuPDFCore
public synchronized void drawPage(Bitmap bm, int page,
int pageW, int pageH,
int patchX, int patchY,
- int patchW, int patchH) {
+ int patchW, int patchH,
+ MuPDFCore.Cookie cookie) {
gotoPage(page);
- drawPage(bm, pageW, pageH, patchX, patchY, patchW, patchH);
+ drawPage(bm, pageW, pageH, patchX, patchY, patchW, patchH, cookie.cookiePtr);
}
public synchronized void updatePage(Bitmap bm, int page,
int pageW, int pageH,
int patchX, int patchY,
- int patchW, int patchH) {
- updatePageInternal(bm, page, pageW, pageH, patchX, patchY, patchW, patchH);
+ int patchW, int patchH,
+ MuPDFCore.Cookie cookie) {
+ updatePageInternal(bm, page, pageW, pageH, patchX, patchY, patchW, patchH, cookie.cookiePtr);
}
public synchronized PassClickResult passClickEvent(int page, float x, float y) {
diff --git a/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java b/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
index 0d3cc961..c18f44ab 100644
--- a/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
+++ b/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
@@ -2,6 +2,8 @@ package com.artifex.mupdfdemo;
import java.util.ArrayList;
+import com.artifex.mupdfdemo.MuPDFCore.Cookie;
+
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.ClipData;
@@ -550,16 +552,31 @@ public class MuPDFPageView extends PageView implements MuPDFView {
return true;
}
+
@Override
- protected void drawPage(Bitmap bm, int sizeX, int sizeY,
- int patchX, int patchY, int patchWidth, int patchHeight) {
- mCore.drawPage(bm, mPageNumber, sizeX, sizeY, patchX, patchY, patchWidth, patchHeight);
+ protected CancellableTaskDefinition<Void, Void> getDrawPageTask(final Bitmap bm, final int sizeX, final int sizeY,
+ final int patchX, final int patchY, final int patchWidth, final int patchHeight) {
+ return new MuPDFCancellableTaskDefinition<Void, Void>(mCore) {
+ @Override
+ public Void doInBackground(MuPDFCore.Cookie cookie, Void ... params) {
+ mCore.drawPage(bm, mPageNumber, sizeX, sizeY, patchX, patchY, patchWidth, patchHeight, cookie);
+ return null;
+ }
+ };
+
}
- @Override
- protected void updatePage(Bitmap bm, int sizeX, int sizeY,
- int patchX, int patchY, int patchWidth, int patchHeight) {
- mCore.updatePage(bm, mPageNumber, sizeX, sizeY, patchX, patchY, patchWidth, patchHeight);
+ protected CancellableTaskDefinition<Void, Void> getUpdatePageTask(final Bitmap bm, final int sizeX, final int sizeY,
+ final int patchX, final int patchY, final int patchWidth, final int patchHeight)
+ {
+ return new MuPDFCancellableTaskDefinition<Void, Void>(mCore) {
+
+ @Override
+ public Void doInBackground(MuPDFCore.Cookie cookie, Void ... params) {
+ mCore.updatePage(bm, mPageNumber, sizeX, sizeY, patchX, patchY, patchWidth, patchHeight, cookie);
+ return null;
+ }
+ };
}
@Override
diff --git a/platform/android/src/com/artifex/mupdfdemo/PageView.java b/platform/android/src/com/artifex/mupdfdemo/PageView.java
index b7ef580d..c7fecea1 100644
--- a/platform/android/src/com/artifex/mupdfdemo/PageView.java
+++ b/platform/android/src/com/artifex/mupdfdemo/PageView.java
@@ -21,18 +21,6 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
-class PatchInfo {
- public Point patchViewSize;
- public Rect patchArea;
- public boolean completeRedraw;
-
- public PatchInfo(Point aPatchViewSize, Rect aPatchArea, boolean aCompleteRedraw) {
- patchViewSize = aPatchViewSize;
- patchArea = aPatchArea;
- completeRedraw = aCompleteRedraw;
- }
-}
-
// Make our ImageViews opaque to optimize redraw
class OpaqueImageView extends ImageView {
@@ -117,13 +105,13 @@ public abstract class PageView extends ViewGroup {
private Matrix mEntireMat;
private AsyncTask<Void,Void,TextWord[][]> mGetText;
private AsyncTask<Void,Void,LinkInfo[]> mGetLinkInfo;
- private AsyncTask<Void,Void,Void> mDrawEntire;
+ private CancellableAsyncTask<Void, Void> mDrawEntire;
private Point mPatchViewSize; // View size on the basis of which the patch was created
private Rect mPatchArea;
private ImageView mPatch;
private Bitmap mPatchBm;
- private AsyncTask<PatchInfo,Void,PatchInfo> mDrawPatch;
+ private CancellableAsyncTask<Void,Void> mDrawPatch;
private RectF mSearchBoxes[];
protected LinkInfo mLinks[];
private RectF mSelectBox;
@@ -147,8 +135,8 @@ public abstract class PageView extends ViewGroup {
mEntireMat = new Matrix();
}
- protected abstract void drawPage(Bitmap bm, int sizeX, int sizeY, int patchX, int patchY, int patchWidth, int patchHeight);
- protected abstract void updatePage(Bitmap bm, int sizeX, int sizeY, int patchX, int patchY, int patchWidth, int patchHeight);
+ protected abstract CancellableTaskDefinition<Void, Void> getDrawPageTask(Bitmap bm, int sizeX, int sizeY, int patchX, int patchY, int patchWidth, int patchHeight);
+ protected abstract CancellableTaskDefinition<Void, Void> getUpdatePageTask(Bitmap bm, int sizeX, int sizeY, int patchX, int patchY, int patchWidth, int patchHeight);
protected abstract LinkInfo[] getLinkInfo();
protected abstract TextWord[][] getText();
protected abstract void addMarkup(PointF[] quadPoints, Annotation.Type type);
@@ -156,12 +144,12 @@ public abstract class PageView extends ViewGroup {
private void reinit() {
// Cancel pending render task
if (mDrawEntire != null) {
- mDrawEntire.cancel(true);
+ mDrawEntire.cancelAndWait();
mDrawEntire = null;
}
if (mDrawPatch != null) {
- mDrawPatch.cancel(true);
+ mDrawPatch.cancelAndWait();
mDrawPatch = null;
}
@@ -233,7 +221,7 @@ public abstract class PageView extends ViewGroup {
public void setPage(int page, PointF size) {
// Cancel pending render task
if (mDrawEntire != null) {
- mDrawEntire.cancel(true);
+ mDrawEntire.cancelAndWait();
mDrawEntire = null;
}
@@ -274,13 +262,10 @@ public abstract class PageView extends ViewGroup {
mGetLinkInfo.execute();
// Render the page in the background
- mDrawEntire = new AsyncTask<Void,Void,Void>() {
- protected Void doInBackground(Void... v) {
- drawPage(mEntireBm, mSize.x, mSize.y, 0, 0, mSize.x, mSize.y);
- return null;
- }
+ mDrawEntire = new CancellableAsyncTask<Void, Void>(getDrawPageTask(mEntireBm, mSize.x, mSize.y, 0, 0, mSize.x, mSize.y)) {
- protected void onPreExecute() {
+ @Override
+ public void onPreExecute() {
setBackgroundColor(BACKGROUND_COLOR);
mEntire.setImageBitmap(null);
mEntire.invalidate();
@@ -300,12 +285,14 @@ public abstract class PageView extends ViewGroup {
}
}
- protected void onPostExecute(Void v) {
+ @Override
+ public void onPostExecute(Void result) {
removeView(mBusyIndicator);
mBusyIndicator = null;
mEntire.setImageBitmap(mEntireBm);
mEntire.invalidate();
setBackgroundColor(Color.TRANSPARENT);
+
}
};
@@ -588,8 +575,8 @@ public abstract class PageView extends ViewGroup {
mPatch.invalidate();
}
} else {
- Point patchViewSize = new Point(viewArea.width(), viewArea.height());
- Rect patchArea = new Rect(0, 0, mParentSize.x, mParentSize.y);
+ final Point patchViewSize = new Point(viewArea.width(), viewArea.height());
+ final Rect patchArea = new Rect(0, 0, mParentSize.x, mParentSize.y);
// Intersect and test that there is an intersection
if (!patchArea.intersect(viewArea))
@@ -608,7 +595,7 @@ public abstract class PageView extends ViewGroup {
// Stop the drawing of previous patch if still going
if (mDrawPatch != null) {
- mDrawPatch.cancel(true);
+ mDrawPatch.cancelAndWait();
mDrawPatch = null;
}
@@ -620,24 +607,22 @@ public abstract class PageView extends ViewGroup {
mSearchView.bringToFront();
}
- mDrawPatch = new AsyncTask<PatchInfo,Void,PatchInfo>() {
- protected PatchInfo doInBackground(PatchInfo... v) {
- if (v[0].completeRedraw) {
- drawPage(mPatchBm, v[0].patchViewSize.x, v[0].patchViewSize.y,
- v[0].patchArea.left, v[0].patchArea.top,
- v[0].patchArea.width(), v[0].patchArea.height());
- } else {
- updatePage(mPatchBm, v[0].patchViewSize.x, v[0].patchViewSize.y,
- v[0].patchArea.left, v[0].patchArea.top,
- v[0].patchArea.width(), v[0].patchArea.height());
- }
+ CancellableTaskDefinition<Void, Void> task;
- return v[0];
- }
+ if (completeRedraw)
+ task = getDrawPageTask(mPatchBm, patchViewSize.x, patchViewSize.y,
+ patchArea.left, patchArea.top,
+ patchArea.width(), patchArea.height());
+ else
+ task = getUpdatePageTask(mPatchBm, patchViewSize.x, patchViewSize.y,
+ patchArea.left, patchArea.top,
+ patchArea.width(), patchArea.height());
+
+ mDrawPatch = new CancellableAsyncTask<Void,Void>(task) {
- protected void onPostExecute(PatchInfo v) {
- mPatchViewSize = v.patchViewSize;
- mPatchArea = v.patchArea;
+ public void onPostExecute(Void result) {
+ mPatchViewSize = patchViewSize;
+ mPatchArea = patchArea;
mPatch.setImageBitmap(mPatchBm);
mPatch.invalidate();
//requestLayout();
@@ -647,30 +632,27 @@ public abstract class PageView extends ViewGroup {
}
};
- mDrawPatch.execute(new PatchInfo(patchViewSize, patchArea, completeRedraw));
+ mDrawPatch.execute();
}
}
public void update() {
// Cancel pending render task
if (mDrawEntire != null) {
- mDrawEntire.cancel(true);
+ mDrawEntire.cancelAndWait();
mDrawEntire = null;
}
if (mDrawPatch != null) {
- mDrawPatch.cancel(true);
+ mDrawPatch.cancelAndWait();
mDrawPatch = null;
}
+
// Render the page in the background
- mDrawEntire = new AsyncTask<Void,Void,Void>() {
- protected Void doInBackground(Void... v) {
- updatePage(mEntireBm, mSize.x, mSize.y, 0, 0, mSize.x, mSize.y);
- return null;
- }
+ mDrawEntire = new CancellableAsyncTask<Void, Void>(getUpdatePageTask(mEntireBm, mSize.x, mSize.y, 0, 0, mSize.x, mSize.y)) {
- protected void onPostExecute(Void v) {
+ public void onPostExecute(Void result) {
mEntire.setImageBitmap(mEntireBm);
mEntire.invalidate();
}
@@ -684,7 +666,7 @@ public abstract class PageView extends ViewGroup {
public void removeHq() {
// Stop the drawing of the patch if still going
if (mDrawPatch != null) {
- mDrawPatch.cancel(true);
+ mDrawPatch.cancelAndWait();
mDrawPatch = null;
}