diff options
6 files changed, 81 insertions, 18 deletions
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index cf0fb2f98..f59b2099c 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -100,7 +100,7 @@ public class CameraDataAdapter implements LocalDataAdapter { return mImages.get(dataID).getView( activity, mSuggestedWidth, mSuggestedHeight, - mPlaceHolder.getConstantState().newDrawable()); + mPlaceHolder.getConstantState().newDrawable(), this); } @Override diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java index 05923b407..e26ec2785 100644 --- a/src/com/android/camera/data/FixedFirstDataAdapter.java +++ b/src/com/android/camera/data/FixedFirstDataAdapter.java @@ -110,7 +110,7 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper public View getView(Activity activity, int dataID) { if (dataID == 0) { return mFirstData.getView( - activity, mSuggestedWidth, mSuggestedHeight, null); + activity, mSuggestedWidth, mSuggestedHeight, null, null); } return mAdapter.getView(activity, dataID - 1); } diff --git a/src/com/android/camera/data/FixedLastDataAdapter.java b/src/com/android/camera/data/FixedLastDataAdapter.java index a7157de19..b7e2c45d3 100644 --- a/src/com/android/camera/data/FixedLastDataAdapter.java +++ b/src/com/android/camera/data/FixedLastDataAdapter.java @@ -117,7 +117,7 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper { return mAdapter.getView(activity, dataID); } else if (dataID == totalNumber) { return mLastData.getView(activity, - mSuggestedWidth, mSuggestedHeight, null); + mSuggestedWidth, mSuggestedHeight, null, null); } return null; diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index 844cc5548..cfdcfa459 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -68,7 +68,8 @@ public interface LocalData extends FilmStripView.ImageData { */ public static final int LOCAL_360_PHOTO_SPHERE = 6; - View getView(Activity a, int width, int height, Drawable placeHolder); + View getView(Activity a, int width, int height, Drawable placeHolder, + LocalDataAdapter adapter); /** * Gets the date when this data is created. The returned date is also used diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java index e08c3032a..f2df94fd4 100644 --- a/src/com/android/camera/data/LocalMediaData.java +++ b/src/com/android/camera/data/LocalMediaData.java @@ -18,6 +18,7 @@ package com.android.camera.data; import android.app.Activity; import android.content.ContentResolver; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; @@ -29,6 +30,7 @@ import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; +import android.provider.MediaStore.Images; import android.util.Log; import android.view.Gravity; import android.view.View; @@ -201,20 +203,23 @@ public abstract class LocalMediaData implements LocalData { } protected ImageView fillImageView(Context ctx, ImageView v, - int decodeWidth, int decodeHeight, Drawable placeHolder) { + int decodeWidth, int decodeHeight, Drawable placeHolder, + LocalDataAdapter adapter) { v.setScaleType(ImageView.ScaleType.FIT_XY); v.setImageDrawable(placeHolder); - BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight); + BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight, + ctx.getContentResolver(), adapter); task.execute(); return v; } @Override public View getView(Activity activity, - int decodeWidth, int decodeHeight, Drawable placeHolder) { + int decodeWidth, int decodeHeight, Drawable placeHolder, + LocalDataAdapter adapter) { return fillImageView(activity, new ImageView(activity), - decodeWidth, decodeHeight, placeHolder); + decodeWidth, decodeHeight, placeHolder, adapter); } @Override @@ -277,7 +282,8 @@ public abstract class LocalMediaData implements LocalData { public abstract int getViewType(); protected abstract BitmapLoadTask getBitmapLoadTask( - ImageView v, int decodeWidth, int decodeHeight); + ImageView v, int decodeWidth, int decodeHeight, + ContentResolver resolver, LocalDataAdapter adapter); public static final class PhotoData extends LocalMediaData { private static final String TAG = "CAM_PhotoData"; @@ -466,18 +472,28 @@ public abstract class LocalMediaData implements LocalData { @Override protected BitmapLoadTask getBitmapLoadTask( - ImageView v, int decodeWidth, int decodeHeight) { - return new PhotoBitmapLoadTask(v, decodeWidth, decodeHeight); + ImageView v, int decodeWidth, int decodeHeight, + ContentResolver resolver, LocalDataAdapter adapter) { + return new PhotoBitmapLoadTask(v, decodeWidth, decodeHeight, + resolver, adapter); } private final class PhotoBitmapLoadTask extends BitmapLoadTask { - private int mDecodeWidth; - private int mDecodeHeight; + private final int mDecodeWidth; + private final int mDecodeHeight; + private final ContentResolver mResolver; + private final LocalDataAdapter mAdapter; - public PhotoBitmapLoadTask(ImageView v, int decodeWidth, int decodeHeight) { + private boolean mNeedsRefresh; + + public PhotoBitmapLoadTask(ImageView v, int decodeWidth, + int decodeHeight, ContentResolver resolver, + LocalDataAdapter adapter) { super(v); mDecodeWidth = decodeWidth; mDecodeHeight = decodeHeight; + mResolver = resolver; + mAdapter = adapter; } @Override @@ -496,6 +512,40 @@ public abstract class LocalMediaData implements LocalData { return null; } Bitmap b = BitmapFactory.decodeFile(mPath, opts); + + // For correctness, we need to double check the size here. The + // good news is that decoding bounds take much less time than + // decoding samples like < 1%. + // TODO: better organize the decoding and sampling by using a + // image cache. + int width = 0; + int height = 0; + BitmapFactory.Options justBoundsOpts = new BitmapFactory.Options(); + justBoundsOpts.inJustDecodeBounds = true; + BitmapFactory.decodeFile(mPath, justBoundsOpts); + if (justBoundsOpts.outWidth > 0 && justBoundsOpts.outHeight > 0) { + width = justBoundsOpts.outWidth; + height = justBoundsOpts.outHeight; + } + if (mOrientation == 90 || mOrientation == 270) { + int temp = width; + width = height; + height = temp; + } + + // If the decoded width and height is valid and not matching the + // values from MediaStore, then update the MediaStore. This only + // happened when the MediaStore had been told a wrong data. + if (width > 0 && height > 0 && (width != mWidth || height != mHeight)) { + ContentValues values = new ContentValues(); + values.put(Images.Media.WIDTH, width); + values.put(Images.Media.HEIGHT, height); + mResolver.update(getContentUri(), values, null, null); + mNeedsRefresh = true; + Log.w(TAG, "MediaStore has been updated with correct size!"); + return null; + } + if (mOrientation != 0 && b != null) { if (isCancelled() || !isUsing()) { return null; @@ -506,6 +556,14 @@ public abstract class LocalMediaData implements LocalData { } return b; } + + @Override + protected void onPostExecute(Bitmap bitmap) { + super.onPostExecute(bitmap); + if (mNeedsRefresh && mAdapter != null) { + mAdapter.refresh(mResolver, getContentUri()); + } + } } @Override @@ -691,14 +749,16 @@ public abstract class LocalMediaData implements LocalData { @Override public View getView(final Activity activity, - int decodeWidth, int decodeHeight, Drawable placeHolder) { + int decodeWidth, int decodeHeight, Drawable placeHolder, + LocalDataAdapter adapter) { // ImageView for the bitmap. ImageView iv = new ImageView(activity); iv.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER)); - fillImageView(activity, iv, decodeWidth, decodeHeight, placeHolder); + fillImageView(activity, iv, decodeWidth, decodeHeight, placeHolder, + adapter); // ImageView for the play icon. ImageView icon = new ImageView(activity); @@ -727,7 +787,8 @@ public abstract class LocalMediaData implements LocalData { @Override protected BitmapLoadTask getBitmapLoadTask( - ImageView v, int decodeWidth, int decodeHeight) { + ImageView v, int decodeWidth, int decodeHeight, + ContentResolver resolver, LocalDataAdapter adapter) { return new VideoBitmapLoadTask(v); } diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java index c440296b8..2391f0f95 100644 --- a/src/com/android/camera/data/SimpleViewData.java +++ b/src/com/android/camera/data/SimpleViewData.java @@ -120,7 +120,8 @@ public class SimpleViewData implements LocalData { } @Override - public View getView(Activity activity, int width, int height, Drawable placeHolder) { + public View getView(Activity activity, int width, int height, Drawable placeHolder, + LocalDataAdapter adapter) { return mView; } |