summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/ReviewImage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/ReviewImage.java')
-rw-r--r--src/com/android/camera/ReviewImage.java261
1 files changed, 7 insertions, 254 deletions
diff --git a/src/com/android/camera/ReviewImage.java b/src/com/android/camera/ReviewImage.java
index 9d6d146..73f6bae 100644
--- a/src/com/android/camera/ReviewImage.java
+++ b/src/com/android/camera/ReviewImage.java
@@ -71,7 +71,7 @@ public class ReviewImage extends Activity implements View.OnClickListener {
private static final boolean AUTO_DISMISS = true;
private static final boolean NO_AUTO_DISMISS = false;
- private ReviewImageGetter mGetter;
+ private ImageGetter mGetter;
private Uri mSavedUri;
private boolean mPaused = true;
@@ -79,7 +79,7 @@ public class ReviewImage extends Activity implements View.OnClickListener {
private static final int[] sOrderAdjacents = new int[] {0, 1, -1};
private static final int[] sOrderSlideshow = new int[] {0};
- final LocalHandler mHandler = new LocalHandler();
+ final GetterHandler mHandler = new GetterHandler();
private final Random mRandom = new Random(System.currentTimeMillis());
private int [] mShuffleOrder = null;
@@ -423,7 +423,7 @@ public class ReviewImage extends Activity implements View.OnClickListener {
}
ImageGetterCallback cb = new ImageGetterCallback() {
- public void completed(boolean wasCanceled) {
+ public void completed() {
mImageView.setFocusableInTouchMode(true);
mImageView.requestFocus();
}
@@ -475,7 +475,7 @@ public class ReviewImage extends Activity implements View.OnClickListener {
// Could be null if we're stopping a slide show in the course of pausing
if (mGetter != null) {
- mGetter.setPosition(pos, cb);
+ mGetter.setPosition(pos, cb, mAllImages, mHandler);
}
updateActionIcons();
showOnScreenControls(AUTO_DISMISS);
@@ -708,7 +708,7 @@ public class ReviewImage extends Activity implements View.OnClickListener {
final long targetDisplayTime = System.currentTimeMillis() + delay;
ImageGetterCallback cb = new ImageGetterCallback() {
- public void completed(boolean wasCanceled) {
+ public void completed() {
}
public boolean wantsThumbnail(int pos, int offset) {
@@ -796,12 +796,12 @@ public class ReviewImage extends Activity implements View.OnClickListener {
if (mShuffleOrder != null) {
pos = mShuffleOrder[pos];
}
- mGetter.setPosition(pos, cb);
+ mGetter.setPosition(pos, cb, mAllImages, mHandler);
}
}
private void makeGetter() {
- mGetter = new ReviewImageGetter(this);
+ mGetter = new ImageGetter();
}
private IImageList buildImageListFromUri(Uri uri) {
@@ -984,253 +984,6 @@ public class ReviewImage extends Activity implements View.OnClickListener {
break;
}
}
-
- static class LocalHandler extends Handler {
- private static final int IMAGE_GETTER_CALLBACK = 1;
-
- @Override
- public void handleMessage(Message message) {
- switch(message.what) {
- case IMAGE_GETTER_CALLBACK:
- ((Runnable) message.obj).run();
- break;
- }
- }
-
- public void postGetterCallback(Runnable callback) {
- postDelayedGetterCallback(callback, 0);
- }
-
- public void postDelayedGetterCallback(Runnable callback, long delay) {
- if (callback == null) {
- throw new NullPointerException();
- }
- Message message = Message.obtain();
- message.what = IMAGE_GETTER_CALLBACK;
- message.obj = callback;
- sendMessageDelayed(message, delay);
- }
-
- public void removeAllGetterCallbacks() {
- removeMessages(IMAGE_GETTER_CALLBACK);
- }
- }
-}
-
-class ReviewImageGetter {
-
- @SuppressWarnings("unused")
- private static final String TAG = "ImageGetter";
-
- // The thread which does the work.
- private final Thread mGetterThread;
-
- // The base position that's being retrieved. The actual images retrieved
- // are this base plus each of the offets.
- private int mCurrentPosition = -1;
-
- // The callback to invoke for each image.
- private ImageGetterCallback mCB;
-
- // This is the loader cancelable that gets set while we're loading an image.
- // If we change position we can cancel the current load using this.
- private Cancelable<Bitmap> mLoad;
-
- // True if we're canceling the current load.
- private boolean mCancelCurrent = false;
-
- // True when the therad should exit.
- private boolean mDone = false;
-
- // True when the loader thread is waiting for work.
- private boolean mReady = false;
-
- // The ViewImage this ImageGetter belongs to
- ReviewImage mViewImage;
-
- void cancelCurrent() {
- synchronized (this) {
- if (!mReady) {
- mCancelCurrent = true;
- Cancelable<Bitmap> load = mLoad;
- if (load != null) {
- load.requestCancel();
- }
- mCancelCurrent = false;
- }
- }
- }
-
- private class ImageGetterRunnable implements Runnable {
- private Runnable callback(final int position, final int offset,
- final boolean isThumb, final Bitmap bitmap) {
- return new Runnable() {
- public void run() {
- // check for inflight callbacks that aren't applicable
- // any longer before delivering them
- if (!isCanceled() && position == mCurrentPosition) {
- mCB.imageLoaded(position, offset, bitmap, isThumb);
- } else if (bitmap != null) {
- bitmap.recycle();
- }
- }
- };
- }
-
- private Runnable completedCallback(final boolean wasCanceled) {
- return new Runnable() {
- public void run() {
- mCB.completed(wasCanceled);
- }
- };
- }
-
- public void run() {
- int lastPosition = -1;
- while (!mDone) {
- synchronized (ReviewImageGetter.this) {
- mReady = true;
- ReviewImageGetter.this.notify();
-
- if (mCurrentPosition == -1
- || lastPosition == mCurrentPosition) {
- try {
- ReviewImageGetter.this.wait();
- } catch (InterruptedException ex) {
- continue;
- }
- }
-
- lastPosition = mCurrentPosition;
- mReady = false;
- }
-
- if (lastPosition != -1) {
- int imageCount = mViewImage.mAllImages.getCount();
-
- int [] order = mCB.loadOrder();
- for (int i = 0; i < order.length; i++) {
- int offset = order[i];
- int imageNumber = lastPosition + offset;
- if (imageNumber >= 0 && imageNumber < imageCount) {
- IImage image = mViewImage.mAllImages
- .getImageAt(lastPosition + offset);
- if (image == null || isCanceled()) {
- break;
- }
- if (mCB.wantsThumbnail(lastPosition, offset)) {
- Bitmap b = image.thumbBitmap();
- mViewImage.mHandler.postGetterCallback(
- callback(lastPosition, offset,
- true, b));
- }
- }
- }
-
- for (int i = 0; i < order.length; i++) {
- int offset = order[i];
- int imageNumber = lastPosition + offset;
- if (imageNumber >= 0 && imageNumber < imageCount) {
- IImage image = mViewImage.mAllImages
- .getImageAt(lastPosition + offset);
- if (mCB.wantsFullImage(lastPosition, offset)
- && !(image instanceof VideoObject)) {
- int sizeToUse = mCB.fullImageSizeToUse(
- lastPosition, offset);
- if (image != null && !isCanceled()) {
- mLoad = image.fullSizeBitmapCancelable(
- sizeToUse,
- Util.createNativeAllocOptions());
- }
- if (mLoad != null) {
- // The return value could be null if the
- // bitmap is too big, or we cancelled it.
- Bitmap b;
- try {
- b = mLoad.get();
- } catch (InterruptedException e) {
- b = null;
- } catch (ExecutionException e) {
- throw new RuntimeException(e);
- } catch (CancellationException e) {
- b = null;
- }
- mLoad = null;
- if (b != null) {
- if (isCanceled()) {
- b.recycle();
- } else {
- Runnable cb = callback(
- lastPosition, offset,
- false, b);
- mViewImage.mHandler
- .postGetterCallback(cb);
- }
- }
- }
- }
- }
- }
- mViewImage.mHandler.postGetterCallback(
- completedCallback(isCanceled()));
- }
- }
- }
- }
-
- public ReviewImageGetter(ReviewImage viewImage) {
- mViewImage = viewImage;
- mGetterThread = new Thread(new ImageGetterRunnable());
- mGetterThread.setName("ImageGettter");
- mGetterThread.start();
- }
-
- private boolean isCanceled() {
- synchronized (this) {
- return mCancelCurrent;
- }
- }
-
- public void setPosition(int position, ImageGetterCallback cb) {
- synchronized (this) {
- if (!mReady) {
- try {
- mCancelCurrent = true;
- // if the thread is waiting before loading the full size
- // image then this will free it up
- BitmapManager.instance()
- .cancelThreadDecoding(mGetterThread);
- ReviewImageGetter.this.notify();
- ReviewImageGetter.this.wait();
- BitmapManager.instance()
- .allowThreadDecoding(mGetterThread);
- mCancelCurrent = false;
- } catch (InterruptedException ex) {
- // not sure what to do here
- }
- }
- }
-
- mCurrentPosition = position;
- mCB = cb;
-
- synchronized (this) {
- ReviewImageGetter.this.notify();
- }
- }
-
- public void stop() {
- synchronized (this) {
- mDone = true;
- ReviewImageGetter.this.notify();
- }
- try {
- BitmapManager.instance().cancelThreadDecoding(mGetterThread);
- mGetterThread.join();
- } catch (InterruptedException ex) {
- // Ignore the exception
- }
- }
}
class ImageViewTouch2 extends ImageViewTouchBase {