diff options
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/camera/ImageLoader.java | 2 | ||||
-rw-r--r-- | src/com/android/camera/gallery/BaseImage.java | 27 | ||||
-rw-r--r-- | src/com/android/camera/gallery/BaseImageList.java | 23 | ||||
-rw-r--r-- | src/com/android/camera/gallery/MiniThumbFile.java | 8 |
4 files changed, 38 insertions, 22 deletions
diff --git a/src/com/android/camera/ImageLoader.java b/src/com/android/camera/ImageLoader.java index da6ea83..d93934b 100644 --- a/src/com/android/camera/ImageLoader.java +++ b/src/com/android/camera/ImageLoader.java @@ -297,10 +297,12 @@ class ThumbnailChecker { Log.e(TAG, "Failed to check thumbnail..." + " was the sd card removed? - " + ex.getMessage()); stopCheckingThumbnails(); + return; } if (!mThumbCheckCallback.checking(mNextToCheck, mTotalToCheck)) { stopCheckingThumbnails(); + return; } mNextToCheck++; diff --git a/src/com/android/camera/gallery/BaseImage.java b/src/com/android/camera/gallery/BaseImage.java index 815c0ef..0235afa 100644 --- a/src/com/android/camera/gallery/BaseImage.java +++ b/src/com/android/camera/gallery/BaseImage.java @@ -297,20 +297,21 @@ public abstract class BaseImage implements IImage { public Bitmap miniThumbBitmap() { try { long id = mId; - long dbMagic = mMiniThumbMagic; - if (dbMagic == 0 || dbMagic == id) { - dbMagic = ((BaseImageList) - getContainer()).checkThumbnail(this, null); - } synchronized (sMiniThumbData) { - dbMagic = mMiniThumbMagic; - byte [] data = mContainer.getMiniThumbFromFile(id, - sMiniThumbData, dbMagic); + byte [] data = null; + + // Try to get it from the file. + if (mMiniThumbMagic != 0) { + data = mContainer.getMiniThumbFromFile(id, sMiniThumbData, + mMiniThumbMagic); + } + + // If it does not exist, try to create the thumbnail if (data == null) { byte[][] createdThumbData = new byte[1][]; try { - dbMagic = ((BaseImageList) getContainer()) + ((BaseImageList) getContainer()) .checkThumbnail(this, createdThumbData); } catch (IOException ex) { // Typically IOException because the sd card is full. @@ -319,13 +320,11 @@ public abstract class BaseImage implements IImage { } data = createdThumbData[0]; } + if (data == null) { - data = mContainer.getMiniThumbFromFile(id, sMiniThumbData, - dbMagic); - } - if (data == null) { - // Unable to get mini-thumb data from file. + // Unable to get mini-thumb. } + if (data != null) { Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length); diff --git a/src/com/android/camera/gallery/BaseImageList.java b/src/com/android/camera/gallery/BaseImageList.java index b49acd1..2f6afba 100644 --- a/src/com/android/camera/gallery/BaseImageList.java +++ b/src/com/android/camera/gallery/BaseImageList.java @@ -188,7 +188,11 @@ public abstract class BaseImageList implements IImageList { values.put(Thumbnails.IMAGE_ID, imageId); values.put(Thumbnails.HEIGHT, height); values.put(Thumbnails.WIDTH, width); - return mContentResolver.insert(mThumbUri, values); + try { + return mContentResolver.insert(mThumbUri, values); + } catch (Exception ex) { + return null; + } } private static final Random sRandom = @@ -212,8 +216,12 @@ public abstract class BaseImageList implements IImageList { int width = options.outWidth; int height = options.outHeight; if (width >= IImage.THUMBNAIL_TARGET_SIZE - && height >= IImage.THUMBNAIL_TARGET_SIZE - && storeThumbnail(thumbData, id, width, height)) { + && height >= IImage.THUMBNAIL_TARGET_SIZE) { + + // We do not check the return value of storeThumbnail because + // we should return the mini thumb even if the storing fails. + storeThumbnail(thumbData, id, width, height); + // this is used for *encoding* the minithumb, so // we don't want to dither or convert to 565 here. // @@ -264,7 +272,7 @@ public abstract class BaseImageList implements IImageList { * thumbnail even if the sdcard is full. * @throws IOException */ - public long checkThumbnail(BaseImage existingImage, + public void checkThumbnail(BaseImage existingImage, byte[][] createdThumbnailData) throws IOException { long magic, id; @@ -273,8 +281,8 @@ public abstract class BaseImageList implements IImageList { if (magic != 0) { long fileMagic = mMiniThumbFile.getMagic(id); - if (fileMagic == magic && magic != 0 && magic != id) { - return magic; + if (fileMagic == magic) { + return; } } @@ -311,6 +319,8 @@ public abstract class BaseImageList implements IImageList { if (createdThumbnailData != null) { createdThumbnailData[0] = data; } + + // This could throw IOException. saveMiniThumbToFile(data, id, magic); } @@ -319,7 +329,6 @@ public abstract class BaseImageList implements IImageList { mContentResolver.update( existingImage.fullSizeImageUri(), values, null, null); existingImage.mMiniThumbMagic = magic; - return magic; } // TODO: Change public to protected diff --git a/src/com/android/camera/gallery/MiniThumbFile.java b/src/com/android/camera/gallery/MiniThumbFile.java index 1a94486..a08cb77 100644 --- a/src/com/android/camera/gallery/MiniThumbFile.java +++ b/src/com/android/camera/gallery/MiniThumbFile.java @@ -79,7 +79,13 @@ class MiniThumbFile { try { mMiniThumbFile = new RandomAccessFile(f, "rw"); } catch (IOException ex) { - // ignore exception + // Open as read-only so we can at least read the existing + // thumbnails. + try { + mMiniThumbFile = new RandomAccessFile(f, "r"); + } catch (IOException ex2) { + // ignore exception + } } } return mMiniThumbFile; |