diff options
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | src/com/android/camera/AndroidCameraManagerImpl.java | 8 | ||||
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 15 | ||||
-rwxr-xr-x | src/com/android/camera/data/CameraDataAdapter.java | 11 | ||||
-rw-r--r-- | src/com/android/camera/data/FixedFirstDataAdapter.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/data/FixedLastDataAdapter.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/data/InProgressDataWrapper.java | 5 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalData.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalMediaData.java | 307 | ||||
-rw-r--r-- | src/com/android/camera/data/SimpleViewData.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/exif/ExifInterface.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/ui/FilmStripView.java | 5 |
12 files changed, 165 insertions, 213 deletions
diff --git a/Android.mk b/Android.mk index faf35b83a..58772ca94 100644 --- a/Android.mk +++ b/Android.mk @@ -7,6 +7,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 LOCAL_STATIC_JAVA_LIBRARIES += xmp_toolkit +LOCAL_STATIC_JAVA_LIBRARIES += glide LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SRC_FILES += $(call all-java-files-under, src_pd) diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java index 521229951..b151c1914 100644 --- a/src/com/android/camera/AndroidCameraManagerImpl.java +++ b/src/com/android/camera/AndroidCameraManagerImpl.java @@ -106,9 +106,6 @@ class AndroidCameraManagerImpl implements CameraManager { private CameraHandler mCameraHandler; private android.hardware.Camera mCamera; - // Used to retain a copy of Parameters for setting parameters. - private Parameters mParamsToSet; - AndroidCameraManagerImpl() { HandlerThread ht = new HandlerThread("Camera Handler Thread"); ht.start(); @@ -224,11 +221,6 @@ class AndroidCameraManagerImpl implements CameraManager { if (mCamera != null) { mParametersIsDirty = true; - - // Get a instance of Camera.Parameters for later use. - if (mParamsToSet == null) { - mParamsToSet = mCamera.getParameters(); - } } else { if (msg.obj != null) { ((CameraOpenErrorCallback) msg.obj).onDeviceOpenFailure(msg.arg1); diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 6b1d8d13f..87ebe60a4 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -116,6 +116,10 @@ import com.android.camera.util.PhotoSphereHelper; import com.android.camera.util.PhotoSphereHelper.PanoramaViewHelper; import com.android.camera.util.UsageStatistics; import org.codeaurora.snapcam.R; +import com.bumptech.glide.Glide; +import com.bumptech.glide.GlideBuilder; +import com.bumptech.glide.MemoryCategory; +import com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor; import java.io.File; import java.io.IOException; @@ -1539,8 +1543,7 @@ public class CameraActivity extends Activity FilmStripView.ImageData.SIZE_FULL); // Put a CameraPreviewData at the first position. mWrappedDataAdapter = new FixedFirstDataAdapter( - new CameraDataAdapter(new ColorDrawable( - getResources().getColor(R.color.photo_placeholder))), + new CameraDataAdapter(R.color.photo_placeholder), mCameraPreviewData); mFilmStripView.setViewGap( @@ -1610,13 +1613,17 @@ public class CameraActivity extends Activity display.getSize(size); int width = size.x; int height = size.y; - int lower = Math.min(width, height); - int offset = lower * 7 / 100; SETTING_LIST_WIDTH_1 = lower / 2 + offset; SETTING_LIST_WIDTH_2 = lower / 2 - offset; registerSDcardMountedReceiver(); + + if (!Glide.isSetup()) { + Glide.setup(new GlideBuilder(getApplicationContext()) + .setResizeService(new FifoPriorityThreadPoolExecutor(2))); + Glide.get(getApplicationContext()).setMemoryCategory(MemoryCategory.HIGH); + } } private void setRotationAnimation() { diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index 4b810a0fa..7059221b8 100755 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -20,7 +20,6 @@ import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; @@ -46,16 +45,16 @@ public class CameraDataAdapter implements LocalDataAdapter { private LocalDataList mImages; private Listener mListener; - private Drawable mPlaceHolder; + private final int mPlaceHolderResourceId; private int mSuggestedWidth = DEFAULT_DECODE_SIZE; private int mSuggestedHeight = DEFAULT_DECODE_SIZE; private LocalData mLocalDataToDelete; - public CameraDataAdapter(Drawable placeHolder) { + public CameraDataAdapter(int placeholderResource) { mImages = new LocalDataList(); - mPlaceHolder = placeHolder; + mPlaceHolderResourceId = placeholderResource; } @Override @@ -94,14 +93,14 @@ public class CameraDataAdapter implements LocalDataAdapter { } @Override - public View getView(Activity activity, int dataID) { + public View getView(Activity activity, int dataID, boolean inFullScreen) { if (dataID >= mImages.size() || dataID < 0) { return null; } return mImages.get(dataID).getView( activity, mSuggestedWidth, mSuggestedHeight, - mPlaceHolder.getConstantState().newDrawable(), this); + mPlaceHolderResourceId, this, inFullScreen); } @Override diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java index aa2025234..a210cb00c 100644 --- a/src/com/android/camera/data/FixedFirstDataAdapter.java +++ b/src/com/android/camera/data/FixedFirstDataAdapter.java @@ -108,12 +108,13 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper } @Override - public View getView(Activity activity, int dataID) { + public View getView(Activity activity, int dataID, boolean inFullScreen) { if (dataID == 0) { return mFirstData.getView( - activity, mSuggestedWidth, mSuggestedHeight, null, null); + activity, mSuggestedWidth, mSuggestedHeight, R.color.photo_placeholder, + null, inFullScreen); } - return mAdapter.getView(activity, dataID - 1); + return mAdapter.getView(activity, dataID - 1, inFullScreen); } @Override diff --git a/src/com/android/camera/data/FixedLastDataAdapter.java b/src/com/android/camera/data/FixedLastDataAdapter.java index 4df0652e1..33fd20d75 100644 --- a/src/com/android/camera/data/FixedLastDataAdapter.java +++ b/src/com/android/camera/data/FixedLastDataAdapter.java @@ -111,14 +111,15 @@ public class FixedLastDataAdapter extends AbstractLocalDataAdapterWrapper { } @Override - public View getView(Activity activity, int dataID) { + public View getView(Activity activity, int dataID, boolean inFullScreen) { int totalNumber = mAdapter.getTotalNumber(); if (dataID < totalNumber) { - return mAdapter.getView(activity, dataID); + return mAdapter.getView(activity, dataID, inFullScreen); } else if (dataID == totalNumber) { return mLastData.getView(activity, - mSuggestedWidth, mSuggestedHeight, null, null); + mSuggestedWidth, mSuggestedHeight, R.color.photo_placeholder, + null, inFullScreen); } return null; diff --git a/src/com/android/camera/data/InProgressDataWrapper.java b/src/com/android/camera/data/InProgressDataWrapper.java index 9ce968e2f..f212b6929 100644 --- a/src/com/android/camera/data/InProgressDataWrapper.java +++ b/src/com/android/camera/data/InProgressDataWrapper.java @@ -50,8 +50,9 @@ public class InProgressDataWrapper implements LocalData { @Override public View getView( Activity a, int width, int height, - Drawable placeHolder, LocalDataAdapter adapter) { - View v = mLocalData.getView(a, width, height, placeHolder, adapter); + int placeHolderResourceId, LocalDataAdapter adapter, boolean inFullScreen) { + View v = mLocalData.getView(a, width, height, placeHolderResourceId, + adapter, inFullScreen); if (mHasProgressBar) { // Return a framelayout with the progressbar and imageview. diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index da64fee30..c9d518d70 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -74,8 +74,8 @@ public interface LocalData extends FilmStripView.ImageData { */ public static final int LOCAL_IN_PROGRESS_DATA = 7; - View getView(Activity a, int width, int height, Drawable placeHolder, - LocalDataAdapter adapter); + View getView(Activity a, int width, int height, int placeHolderResourceId, + LocalDataAdapter adapter, boolean full); /** * 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 e77578b16..c32d6ccf9 100644 --- a/src/com/android/camera/data/LocalMediaData.java +++ b/src/com/android/camera/data/LocalMediaData.java @@ -18,19 +18,13 @@ 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; import android.graphics.BitmapFactory; -import android.graphics.Matrix; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; 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; @@ -42,6 +36,9 @@ import com.android.camera.ui.FilmStripView; import com.android.camera.util.CameraUtil; import com.android.camera.util.PhotoSphereHelper; import org.codeaurora.snapcam.R; +import com.bumptech.glide.BitmapRequestBuilder; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.BitmapEncoder; import java.io.File; import java.text.DateFormat; @@ -55,6 +52,13 @@ import java.util.Locale; * return a bitmap. */ public abstract class LocalMediaData implements LocalData { + + private static final int MEDIASTORE_THUMB_WIDTH = 512; + private static final int MEDIASTORE_THUMB_HEIGHT = 384; + + // GL max texture size: keep bitmaps below this value. + private static final int MAXIMUM_TEXTURE_SIZE = 2048; + protected final long mContentId; protected final String mTitle; protected final String mMimeType; @@ -68,12 +72,18 @@ public abstract class LocalMediaData implements LocalData { protected final double mLatitude; protected final double mLongitude; + protected ImageView mImageView; + /** The panorama metadata information of this media data. */ protected PhotoSphereHelper.PanoramaMetadata mPanoramaMetadata; /** Used to load photo sphere metadata from image files. */ protected PanoramaMetadataLoader mPanoramaMetadataLoader = null; + private static final int JPEG_COMPRESS_QUALITY = 90; + private static final BitmapEncoder JPEG_ENCODER = + new BitmapEncoder(Bitmap.CompressFormat.JPEG, JPEG_COMPRESS_QUALITY); + /** * Used for thumbnail loading optimization. True if this data has a * corresponding visible view. @@ -202,23 +212,25 @@ public abstract class LocalMediaData implements LocalData { } protected ImageView fillImageView(Context ctx, ImageView v, - int decodeWidth, int decodeHeight, Drawable placeHolder, - LocalDataAdapter adapter) { - v.setScaleType(ImageView.ScaleType.FIT_XY); - v.setImageDrawable(placeHolder); - - BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight, - ctx.getContentResolver(), adapter); - task.execute(); + int decodeWidth, int decodeHeight, int placeHolderResourceId, + LocalDataAdapter adapter, boolean inFullScreen) { + Glide.with(ctx) + .loadFromMediaStore(getContentUri(), mMimeType, mDateModifiedInSeconds, 0) + .fitCenter() + .placeholder(placeHolderResourceId) + .into(v); return v; } @Override public View getView(Activity activity, - int decodeWidth, int decodeHeight, Drawable placeHolder, - LocalDataAdapter adapter) { - return fillImageView(activity, new ImageView(activity), - decodeWidth, decodeHeight, placeHolder, adapter); + int decodeWidth, int decodeHeight, int placeHolderResourceId, + LocalDataAdapter adapter, boolean inFullScreen) { + + mImageView = new ImageView(activity); + + return fillImageView(activity, mImageView, + decodeWidth, decodeHeight, placeHolderResourceId, adapter, inFullScreen); } @Override @@ -233,6 +245,10 @@ public abstract class LocalMediaData implements LocalData { synchronized (mUsing) { mUsing = false; } + + if (mImageView != null) { + Glide.clear(mImageView); + } } @Override @@ -280,10 +296,6 @@ public abstract class LocalMediaData implements LocalData { @Override public abstract int getViewType(); - protected abstract BitmapLoadTask getBitmapLoadTask( - ImageView v, int decodeWidth, int decodeHeight, - ContentResolver resolver, LocalDataAdapter adapter); - public static final class PhotoData extends LocalMediaData { private static final String TAG = "CAM_PhotoData"; @@ -467,96 +479,63 @@ public abstract class LocalMediaData implements LocalData { } @Override - protected BitmapLoadTask getBitmapLoadTask( - 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 final int mDecodeWidth; - private final int mDecodeHeight; - private final ContentResolver mResolver; - private final LocalDataAdapter mAdapter; - - 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 - protected Bitmap doInBackground(Void... v) { - int sampleSize = 1; - if (mWidth > mDecodeWidth || mHeight > mDecodeHeight) { - int heightRatio = Math.round((float) mHeight / (float) mDecodeHeight); - int widthRatio = Math.round((float) mWidth / (float) mDecodeWidth); - sampleSize = Math.max(heightRatio, widthRatio); - } - - // 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 decodedWidth = 0; - int decodedHeight = 0; - BitmapFactory.Options justBoundsOpts = new BitmapFactory.Options(); - justBoundsOpts.inJustDecodeBounds = true; - BitmapFactory.decodeFile(mPath, justBoundsOpts); - if (justBoundsOpts.outWidth > 0 && justBoundsOpts.outHeight > 0) { - decodedWidth = justBoundsOpts.outWidth; - decodedHeight = justBoundsOpts.outHeight; - } - - // If the 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 (decodedWidth > 0 && decodedHeight > 0 && - (decodedWidth != mWidth || decodedHeight != mHeight)) { - ContentValues values = new ContentValues(); - values.put(Images.Media.WIDTH, decodedWidth); - values.put(Images.Media.HEIGHT, decodedHeight); - mResolver.update(getContentUri(), values, null, null); - mNeedsRefresh = true; - Log.w(TAG, "Uri " + getContentUri() + " has been updated with" + - " correct size!"); - return null; - } + protected ImageView fillImageView(Context context, final ImageView v, final int decodeWidth, + final int decodeHeight, int placeHolderResourceId, LocalDataAdapter adapter, + boolean inFullScreen) { + loadImage(context, v, decodeWidth, decodeHeight, placeHolderResourceId, inFullScreen); + return v; + } - BitmapFactory.Options opts = new BitmapFactory.Options(); - opts.inSampleSize = sampleSize; - opts.inTempStorage = DECODE_TEMP_STORAGE; - if (isCancelled() || !isUsing()) { - return null; - } - Bitmap b = BitmapFactory.decodeFile(mPath, opts); + private void loadImage(Context context, ImageView imageView, int decodeWidth, + int decodeHeight, int placeHolderResourceId, boolean inFullScreen) { - if (mOrientation != 0 && b != null) { - if (isCancelled() || !isUsing()) { - return null; - } - Matrix m = new Matrix(); - m.setRotate(mOrientation); - b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, false); - } - return b; + if (decodeWidth <= 0 || decodeHeight <=0) { + return; } - @Override - protected void onPostExecute(Bitmap bitmap) { - super.onPostExecute(bitmap); - if (mNeedsRefresh && mAdapter != null) { - mAdapter.refresh(mResolver, getContentUri()); - } + final int overrideWidth; + final int overrideHeight; + final BitmapRequestBuilder<Uri, Bitmap> thumbnailRequest; + if (inFullScreen) { + // Load up to the maximum size Bitmap we can render. + overrideWidth = Math.min(getWidth(), MAXIMUM_TEXTURE_SIZE); + overrideHeight = Math.min(getHeight(), MAXIMUM_TEXTURE_SIZE); + + // Load two thumbnails, first the small low quality thumb from the media store, + // then a medium quality thumbWidth/thumbHeight image. Using two thumbnails ensures + // we don't flicker to grey while we load the maximum size image. + thumbnailRequest = loadUri(context) + .override(decodeWidth, decodeHeight) + .fitCenter() + .thumbnail(loadMediaStoreThumb(context)); + } else { + // Load a medium quality thumbWidth/thumbHeight image. + overrideWidth = decodeWidth; + overrideHeight = decodeHeight; + + // Load a single small low quality thumbnail from the media store. + thumbnailRequest = loadMediaStoreThumb(context); } + loadUri(context) + .placeholder(placeHolderResourceId) + .fitCenter() + .override(overrideWidth, overrideHeight) + .thumbnail(thumbnailRequest) + .into(imageView); + } + + /** Loads a thumbnail with a size targeted to use MediaStore.Images.Thumbnails. */ + private BitmapRequestBuilder<Uri, Bitmap> loadMediaStoreThumb(Context context) { + return loadUri(context) + .override(MEDIASTORE_THUMB_WIDTH, MEDIASTORE_THUMB_HEIGHT); + } + + /** Loads an image using a MediaStore Uri with our default options. */ + private BitmapRequestBuilder<Uri, Bitmap> loadUri(Context context) { + return Glide.with(context) + .loadFromMediaStore(getContentUri(), mMimeType, mDateModifiedInSeconds, mOrientation) + .asBitmap() + .encoder(JPEG_ENCODER); } @Override @@ -750,17 +729,51 @@ public abstract class LocalMediaData implements LocalData { } @Override + protected ImageView fillImageView(Context context, final ImageView v, final int decodeWidth, + final int decodeHeight, int placeHolderResourceId, LocalDataAdapter adapter, + boolean inFullScreen) { + + //TODO: Figure out why these can be <= 0. + if (decodeWidth <= 0 || decodeHeight <=0) { + return v; + } + + // band-aid over a race condition where the filmstrip is in the process + // of refreshing because of new media just as the camera exits + if ((context instanceof Activity) && ((Activity)context).isDestroyed()) { + Log.d(TAG, "aborted fillImageView because context was destroyed"); + return v; + } + + Glide.with(context) + .loadFromMediaStore(getContentUri(), mMimeType, mDateModifiedInSeconds, 0) + .asBitmap() + .encoder(JPEG_ENCODER) + .thumbnail(Glide.with(context) + .loadFromMediaStore(getContentUri(), mMimeType, mDateModifiedInSeconds, 0) + .asBitmap() + .encoder(JPEG_ENCODER) + .override(MEDIASTORE_THUMB_WIDTH, MEDIASTORE_THUMB_HEIGHT)) + .placeholder(placeHolderResourceId) + .fitCenter() + .override(decodeWidth, decodeHeight) + .into(v); + + return v; + } + + @Override public View getView(final Activity activity, - int decodeWidth, int decodeHeight, Drawable placeHolder, - LocalDataAdapter adapter) { + int decodeWidth, int decodeHeight, int placeHolderResourceId, + LocalDataAdapter adapter, boolean inFullScreen) { // ImageView for the bitmap. - ImageView iv = new ImageView(activity); - iv.setLayoutParams(new FrameLayout.LayoutParams( + mImageView = new ImageView(activity); + mImageView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER)); - fillImageView(activity, iv, decodeWidth, decodeHeight, placeHolder, - adapter); + fillImageView(activity, mImageView, decodeWidth, decodeHeight, placeHolderResourceId, + adapter, inFullScreen); // ImageView for the play icon. ImageView icon = new ImageView(activity); @@ -777,7 +790,7 @@ public abstract class LocalMediaData implements LocalData { }); FrameLayout f = new FrameLayout(activity); - f.addView(iv); + f.addView(mImageView); f.addView(icon); return f; } @@ -788,46 +801,6 @@ public abstract class LocalMediaData implements LocalData { } @Override - protected BitmapLoadTask getBitmapLoadTask( - ImageView v, int decodeWidth, int decodeHeight, - ContentResolver resolver, LocalDataAdapter adapter) { - return new VideoBitmapLoadTask(v); - } - - private final class VideoBitmapLoadTask extends BitmapLoadTask { - - public VideoBitmapLoadTask(ImageView v) { - super(v); - } - - @Override - protected Bitmap doInBackground(Void... v) { - if (isCancelled() || !isUsing()) { - return null; - } - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - Bitmap bitmap = null; - try { - retriever.setDataSource(mPath); - byte[] data = retriever.getEmbeddedPicture(); - if (!isCancelled() && isUsing()) { - if (data != null) { - bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); - } - if (bitmap == null) { - bitmap = retriever.getFrameAtTime(); - } - } - } catch (IllegalArgumentException e) { - Log.e(TAG, "MediaMetadataRetriever.setDataSource() fail:" - + e.getMessage()); - } - retriever.release(); - return bitmap; - } - } - - @Override public boolean rotate90Degrees(Context context, LocalDataAdapter adapter, int currentDataId, boolean clockwise) { // We don't support rotation for video data. @@ -836,30 +809,4 @@ public abstract class LocalMediaData implements LocalData { } } - /** - * An {@link AsyncTask} class that loads the bitmap in the background - * thread. Sub-classes should implement their own - * {@code BitmapLoadTask#doInBackground(Void...)}." - */ - protected abstract class BitmapLoadTask extends AsyncTask<Void, Void, Bitmap> { - protected ImageView mView; - - protected BitmapLoadTask(ImageView v) { - mView = v; - } - - @Override - protected void onPostExecute(Bitmap bitmap) { - if (!isUsing()) { - return; - } - if (bitmap == null) { - Log.e(TAG, "Failed decoding bitmap for file:" + mPath); - return; - } - BitmapDrawable d = new BitmapDrawable(bitmap); - mView.setScaleType(ImageView.ScaleType.FIT_XY); - mView.setImageDrawable(d); - } - } } diff --git a/src/com/android/camera/data/SimpleViewData.java b/src/com/android/camera/data/SimpleViewData.java index ba4459415..18c4af640 100644 --- a/src/com/android/camera/data/SimpleViewData.java +++ b/src/com/android/camera/data/SimpleViewData.java @@ -120,8 +120,8 @@ public class SimpleViewData implements LocalData { } @Override - public View getView(Activity activity, int width, int height, Drawable placeHolder, - LocalDataAdapter adapter) { + public View getView(Activity activity, int width, int height, int placeHolderResourceId, + LocalDataAdapter adapter, boolean inFullScreen) { return mView; } diff --git a/src/com/android/camera/exif/ExifInterface.java b/src/com/android/camera/exif/ExifInterface.java index 0f495f227..3049d2680 100644 --- a/src/com/android/camera/exif/ExifInterface.java +++ b/src/com/android/camera/exif/ExifInterface.java @@ -36,6 +36,7 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel.MapMode; +import java.nio.MappedByteBuffer; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -1039,11 +1040,12 @@ public class ExifInterface { } // Map only exif header into memory. - ByteBuffer buf = file.getChannel().map(MapMode.READ_WRITE, 0, exifSize); + MappedByteBuffer buf = file.getChannel().map(MapMode.READ_WRITE, 0, exifSize); // Attempt to overwrite tag values without changing lengths (avoids // file copy). ret = rewriteExif(buf, tags); + buf.force(); } catch (IOException e) { closeSilently(file); throw e; diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 3ac0bf6d9..47f480e57 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -281,10 +281,11 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { * * @param activity The {@link Activity} context to create the view. * @param dataID The ID of the image data to be presented. + * @param inFullScreen if the filmstrip is in fullscreen * @return The view representing the image data. Null if unavailable or * the {@code dataID} is out of range. */ - public View getView(Activity activity, int dataID); + public View getView(Activity activity, int dataID, boolean inFullScreen); /** * Returns the {@link ImageData} specified by the ID. @@ -923,7 +924,7 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { return null; } data.prepare(); - View v = mDataAdapter.getView(mActivity, dataID); + View v = mDataAdapter.getView(mActivity, dataID, inFullScreen()); if (v == null) { return null; } |