diff options
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/camera/NewCameraActivity.java | 19 | ||||
-rw-r--r-- | src/com/android/camera/NewPhotoUI.java | 2 | ||||
-rw-r--r-- | src/com/android/camera/data/CameraDataAdapter.java | 88 | ||||
-rw-r--r-- | src/com/android/camera/data/LocalData.java | 102 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java | 41 |
5 files changed, 199 insertions, 53 deletions
diff --git a/src/com/android/camera/NewCameraActivity.java b/src/com/android/camera/NewCameraActivity.java index 0ad38b2f6..3313edea3 100644 --- a/src/com/android/camera/NewCameraActivity.java +++ b/src/com/android/camera/NewCameraActivity.java @@ -37,8 +37,10 @@ import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; +import android.widget.ImageView; import com.android.camera.data.CameraDataAdapter; +import com.android.camera.data.LocalData; import com.android.camera.ui.CameraSwitcher.CameraSwitchListener; import com.android.camera.ui.FilmStripView; import com.android.camera.ui.NewCameraRootView; @@ -152,8 +154,6 @@ public class NewCameraActivity extends Activity String action = intent.getAction(); if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)) { mSecureCamera = true; - // Use a new album when this is started from the lock screen. - //TODO: sSecureAlbumId++; } else if (ACTION_IMAGE_CAPTURE_SECURE.equals(action)) { mSecureCamera = true; } else { @@ -236,7 +236,20 @@ public class NewCameraActivity extends Activity mCurrentModule.onResumeAfterSuper(); // The loading is done in background and will update the filmstrip later. - mDataAdapter.requestLoad(getContentResolver()); + if (!mSecureCamera) { + mDataAdapter.requestLoad(getContentResolver()); + } else { + // Flush out all the original data first. + mDataAdapter.flush(); + ImageView v = (ImageView) getLayoutInflater().inflate( + R.layout.secure_album_placeholder, null); + mDataAdapter.addLocalData( + new LocalData.LocalViewData( + v, + v.getDrawable().getIntrinsicWidth(), + v.getDrawable().getIntrinsicHeight(), + 0, 0)); + } } @Override diff --git a/src/com/android/camera/NewPhotoUI.java b/src/com/android/camera/NewPhotoUI.java index 691c3711a..cd93a7ea9 100644 --- a/src/com/android/camera/NewPhotoUI.java +++ b/src/com/android/camera/NewPhotoUI.java @@ -647,7 +647,7 @@ public class NewPhotoUI implements PieListener, public void onPieOpened(int centerX, int centerY) { //TODO: mActivity.cancelActivityTouchHandling(); //TODO: mActivity.setSwipingEnabled(false); - dismissPopup(false); + dismissPopup(); if (mFaceView != null) { mFaceView.setBlockDraw(true); } diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java index 6e2ff101b..32b3afecc 100644 --- a/src/com/android/camera/data/CameraDataAdapter.java +++ b/src/com/android/camera/data/CameraDataAdapter.java @@ -164,6 +164,55 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { } } + // Update all the data but keep the camera data if already set. + private void replaceData(List<LocalData> list) { + boolean changed = (list != mImages); + LocalData cameraData = null; + if (mImages != null && mImages.size() > 0) { + cameraData = mImages.get(0); + if (cameraData.getType() != ImageData.TYPE_CAMERA_PREVIEW) { + cameraData = null; + } + } + + mImages = list; + if (cameraData != null) { + // camera view exists, so we make sure at least 1 data is in the list. + if (mImages == null) { + mImages = new ArrayList<LocalData>(); + } + mImages.add(0, cameraData); + if (mListener != null) { + // Only the camera data is not changed, everything else is changed. + mListener.onDataUpdated(new UpdateReporter() { + @Override + public boolean isDataRemoved(int id) { + return false; + } + + @Override + public boolean isDataUpdated(int id) { + if (id == 0) return false; + return true; + } + }); + } + } else { + // both might be null. + if (changed) { + mListener.onDataLoaded(); + } + } + } + + public void flush() { + replaceData(null); + } + + public void addLocalData(LocalData data) { + insertData(data); + } + private LocalData buildCameraImageData(int width, int height) { LocalData d = new CameraPreviewData(width, height); return d; @@ -277,43 +326,7 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { @Override protected void onPostExecute(List<LocalData> l) { - boolean changed = (l != mImages); - LocalData cameraData = null; - if (mImages != null && mImages.size() > 0) { - cameraData = mImages.get(0); - if (cameraData.getType() != ImageData.TYPE_CAMERA_PREVIEW) { - cameraData = null; - } - } - - mImages = l; - if (cameraData != null) { - // camera view exists, so we make sure at least 1 data is in the list. - if (mImages == null) { - mImages = new ArrayList<LocalData>(); - } - mImages.add(0, cameraData); - if (mListener != null) { - // Only the camera data is not changed, everything else is changed. - mListener.onDataUpdated(new UpdateReporter() { - @Override - public boolean isDataRemoved(int id) { - return false; - } - - @Override - public boolean isDataUpdated(int id) { - if (id == 0) return false; - return true; - } - }); - } - } else { - // both might be null. - if (changed) { - mListener.onDataLoaded(); - } - } + replaceData(l); } } @@ -378,5 +391,4 @@ public class CameraDataAdapter implements FilmStripView.DataAdapter { // do nothing. } } - } diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java index 9f9be8e80..9ebc9caa3 100644 --- a/src/com/android/camera/data/LocalData.java +++ b/src/com/android/camera/data/LocalData.java @@ -21,6 +21,7 @@ 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.os.AsyncTask; @@ -32,6 +33,7 @@ import android.view.View; import android.widget.ImageView; import com.android.camera.ui.FilmStripView; +import com.android.gallery3d.R; import java.util.Comparator; import java.util.Date; @@ -39,7 +41,7 @@ import java.util.Date; /* An abstract interface that represents the local media data. Also implements * Comparable interface so we can sort in DataAdapter. */ -abstract interface LocalData extends FilmStripView.ImageData { +public abstract interface LocalData extends FilmStripView.ImageData { static final String TAG = "LocalData"; abstract View getView(Context c, int width, int height, Drawable placeHolder); @@ -123,19 +125,23 @@ abstract interface LocalData extends FilmStripView.ImageData { return false; } - @Override - public View getView(Context c, + protected ImageView getImageView(Context c, int decodeWidth, int decodeHeight, Drawable placeHolder) { ImageView v = new ImageView(c); - v.setImageDrawable(placeHolder); + v.setBackground(placeHolder); - v.setScaleType(ImageView.ScaleType.FIT_XY); BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight); task.execute(); return v; } @Override + public View getView(Context c, + int decodeWidth, int decodeHeight, Drawable placeHolder) { + return getImageView(c, decodeWidth, decodeHeight, placeHolder); + } + + @Override public void prepare() { synchronized (mUsing) { mUsing = true; @@ -179,8 +185,9 @@ abstract interface LocalData extends FilmStripView.ImageData { Log.e(TAG, "Failed decoding bitmap for file:" + path); return; } - mView.setScaleType(ImageView.ScaleType.FIT_XY); - mView.setImageBitmap(bitmap); + BitmapDrawable d = new BitmapDrawable(bitmap); + d.setGravity(android.view.Gravity.FILL); + mView.setBackground(d); } } } @@ -403,6 +410,15 @@ abstract interface LocalData extends FilmStripView.ImageData { } @Override + public View getView(Context c, + int decodeWidth, int decodeHeight, Drawable placeHolder) { + ImageView v = getImageView(c, decodeWidth, decodeHeight, placeHolder); + v.setImageResource(R.drawable.ic_control_play); + v.setScaleType(ImageView.ScaleType.CENTER); + return v; + } + + @Override protected BitmapLoadTask getBitmapLoadTask( ImageView v, int decodeWidth, int decodeHeight) { return new VideoBitmapLoadTask(v); @@ -438,5 +454,77 @@ abstract interface LocalData extends FilmStripView.ImageData { } } } + + /* + * A LocalData that does nothing but only shows a view. + */ + public static class LocalViewData implements LocalData { + private int mWidth; + private int mHeight; + View mView; + private long mDateTaken; + private long mDateModified; + + public LocalViewData(View v, + int width, int height, + int dateTaken, int dateModified) { + mView = v; + mWidth = width; + mHeight = height; + mDateTaken = dateTaken; + mDateModified = dateModified; + } + + @Override + public long getDateTaken() { + return mDateTaken; + } + + @Override + public long getDateModified() { + return mDateModified; + } + + @Override + public String getTitle() { + return ""; + } + + @Override + public int getWidth() { + return mWidth; + } + + @Override + public int getHeight() { + return mHeight; + } + + @Override + public int getType() { + return FilmStripView.ImageData.TYPE_PHOTO; + } + + @Override + public boolean isActionSupported(int action) { + if (action == FilmStripView.ImageData.ACTION_PLAY) return true; + return false; + } + + @Override + public View getView(Context c, int width, int height, Drawable placeHolder) { + return mView; + } + + @Override + public void prepare() { + // do nothing. + } + + @Override + public void recycle() { + // do nothing. + } + } } diff --git a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java index b5de6929a..9f7cba30b 100644 --- a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java +++ b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java @@ -65,7 +65,10 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> { void onCursorResult(Cursor cursor); } - private static final String TIME_STAMP_NAME = "'IMG'_yyyyMMdd_HHmmss"; + private static final String TIME_STAMP_NAME = "_yyyyMMdd_HHmmss"; + private static final String PREFIX_PANO = "PANO"; + private static final String PREFIX_IMG = "IMG"; + private static final String POSTFIX_JPG = ".jpg"; private final Context context; private final Uri sourceUri; @@ -84,7 +87,7 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> { this.destinationFile = destination; } - saveFileName = new SimpleDateFormat(TIME_STAMP_NAME).format(new Date( + saveFileName = PREFIX_IMG + new SimpleDateFormat(TIME_STAMP_NAME).format(new Date( System.currentTimeMillis())); } @@ -104,7 +107,10 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> { File saveDirectory = getFinalSaveDirectory(context, sourceUri); String filename = new SimpleDateFormat(TIME_STAMP_NAME).format(new Date( System.currentTimeMillis())); - return new File(saveDirectory, filename + ".JPG"); + if (hasPanoPrefix(context, sourceUri)) { + return new File(saveDirectory, PREFIX_PANO + filename + POSTFIX_JPG); + } + return new File(saveDirectory, PREFIX_IMG + filename + POSTFIX_JPG); } public Object getPanoramaXMPData(Uri source, ImagePreset preset) { @@ -133,7 +139,7 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> { public ExifInterface getExifData(Uri source) { ExifInterface exif = new ExifInterface(); String mimeType = context.getContentResolver().getType(sourceUri); - if (mimeType == ImageLoader.JPEG_MIME_TYPE) { + if (mimeType.equals(ImageLoader.JPEG_MIME_TYPE)) { InputStream inStream = null; try { inStream = context.getContentResolver().openInputStream(source); @@ -264,6 +270,33 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> { } /** + * Gets the actual filename for a Uri from Gallery's ContentProvider. + */ + private static String getTrueFilename(Context context, Uri src) { + if (context == null || src == null) { + return null; + } + final String[] trueName = new String[1]; + querySource(context, src, new String[] { + ImageColumns.DATA + }, new ContentResolverQueryCallback() { + @Override + public void onCursorResult(Cursor cursor) { + trueName[0] = new File(cursor.getString(0)).getName(); + } + }); + return trueName[0]; + } + + /** + * Checks whether the true filename has the panorama image prefix. + */ + private static boolean hasPanoPrefix(Context context, Uri src) { + String name = getTrueFilename(context, src); + return name != null && name.startsWith(PREFIX_PANO); + } + + /** * Insert the content (saved file) with proper source photo properties. */ public static Uri insertContent(Context context, Uri sourceUri, File file, String saveFileName, |