From 382b51fa8f512d7f5d5163715eeb85bbfd0a02c7 Mon Sep 17 00:00:00 2001 From: Wu-cheng Li Date: Mon, 12 Sep 2011 08:02:18 +0800 Subject: The last thumbnail can be an image or video. Query the content resolver with the last image and the last video. Show the thumbnail of the one that has the latest dateTaken. bug:5187868 Change-Id: I51ee4ece8f33aaec46913aad9b2427b43c31c1bb --- src/com/android/camera/Camera.java | 2 +- src/com/android/camera/Thumbnail.java | 69 ++++++++++++++++++++++++--------- src/com/android/camera/VideoCamera.java | 2 +- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 23dd6aa..2d66255 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -412,7 +412,7 @@ public class Camera extends ActivityBase implements FocusManager.Listener, // Update last image if URI is invalid and the storage is ready. if ((mThumbnail == null || !Util.isUriValid(mThumbnail.getUri(), mContentResolver)) && mPicturesRemaining >= 0) { - mThumbnail = Thumbnail.getLastImageThumbnail(mContentResolver); + mThumbnail = Thumbnail.getLastThumbnail(mContentResolver); } if (mThumbnail != null) { mThumbnailView.setBitmap(mThumbnail.getBitmap()); diff --git a/src/com/android/camera/Thumbnail.java b/src/com/android/camera/Thumbnail.java index 01569c5..d35b966 100644 --- a/src/com/android/camera/Thumbnail.java +++ b/src/com/android/camera/Thumbnail.java @@ -131,11 +131,52 @@ public class Thumbnail { return createThumbnail(uri, bitmap, 0); } - public static Thumbnail getLastImageThumbnail(ContentResolver resolver) { + public static Thumbnail getLastThumbnail(ContentResolver resolver) { + Media image = getLastImageThumbnail(resolver); + Media video = getLastVideoThumbnail(resolver); + if (image == null && video == null) return null; + + Bitmap bitmap = null; + Media lastMedia; + // If there is only image or video, get its thumbnail. If both exist, + // get the thumbnail of the one that is newer. + if (image != null && (video == null || image.dateTaken >= video.dateTaken)) { + bitmap = Images.Thumbnails.getThumbnail(resolver, image.id, + Images.Thumbnails.MINI_KIND, null); + lastMedia = image; + } else { + bitmap = Video.Thumbnails.getThumbnail(resolver, video.id, + Video.Thumbnails.MINI_KIND, null); + lastMedia = video; + } + + // Ensure database and storage are in sync. + if (Util.isUriValid(lastMedia.uri, resolver)) { + return createThumbnail(lastMedia.uri, bitmap, lastMedia.orientation); + } + return null; + } + + private static class Media { + public Media(long id, int orientation, long dateTaken, Uri uri) { + this.id = id; + this.orientation = orientation; + this.dateTaken = dateTaken; + this.uri = uri; + } + + public final long id; + public final int orientation; + public final long dateTaken; + public final Uri uri; + } + + public static Media getLastImageThumbnail(ContentResolver resolver) { Uri baseUri = Images.Media.EXTERNAL_CONTENT_URI; Uri query = baseUri.buildUpon().appendQueryParameter("limit", "1").build(); - String[] projection = new String[] {ImageColumns._ID, ImageColumns.ORIENTATION}; + String[] projection = new String[] {ImageColumns._ID, ImageColumns.ORIENTATION, + ImageColumns.DATE_TAKEN}; String selection = ImageColumns.MIME_TYPE + "='image/jpeg' AND " + ImageColumns.BUCKET_ID + '=' + Storage.BUCKET_ID; String order = ImageColumns.DATE_TAKEN + " DESC," + ImageColumns._ID + " DESC"; @@ -145,14 +186,8 @@ public class Thumbnail { cursor = resolver.query(query, projection, selection, null, order); if (cursor != null && cursor.moveToFirst()) { long id = cursor.getLong(0); - int orientation = cursor.getInt(1); - Bitmap bitmap = Images.Thumbnails.getThumbnail(resolver, id, - Images.Thumbnails.MINI_KIND, null); - Uri uri = ContentUris.withAppendedId(baseUri, id); - // Ensure there's no OOM. Ensure database and storage are in sync. - if (Util.isUriValid(uri, resolver)) { - return createThumbnail(uri, bitmap, orientation); - } + return new Media(id, cursor.getInt(1), cursor.getLong(2), + ContentUris.withAppendedId(baseUri, id)); } } finally { if (cursor != null) { @@ -162,11 +197,12 @@ public class Thumbnail { return null; } - public static Thumbnail getLastVideoThumbnail(ContentResolver resolver) { + private static Media getLastVideoThumbnail(ContentResolver resolver) { Uri baseUri = Video.Media.EXTERNAL_CONTENT_URI; Uri query = baseUri.buildUpon().appendQueryParameter("limit", "1").build(); - String[] projection = new String[] {VideoColumns._ID, MediaColumns.DATA}; + String[] projection = new String[] {VideoColumns._ID, MediaColumns.DATA, + VideoColumns.DATE_TAKEN}; String selection = VideoColumns.BUCKET_ID + '=' + Storage.BUCKET_ID; String order = VideoColumns.DATE_TAKEN + " DESC," + VideoColumns._ID + " DESC"; @@ -176,13 +212,8 @@ public class Thumbnail { if (cursor != null && cursor.moveToFirst()) { Log.d(TAG, "getLastVideoThumbnail: " + cursor.getString(1)); long id = cursor.getLong(0); - Bitmap bitmap = Video.Thumbnails.getThumbnail(resolver, id, - Video.Thumbnails.MINI_KIND, null); - Uri uri = ContentUris.withAppendedId(baseUri, id); - // Ensure there's no OOM. Ensure database and storage are in sync. - if (Util.isUriValid(uri, resolver)) { - return createThumbnail(uri, bitmap, 0); - } + return new Media(id, 0, cursor.getLong(2), + ContentUris.withAppendedId(baseUri, id)); } } finally { if (cursor != null) { diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index 33430f5..d178903 100644 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -1686,7 +1686,7 @@ public class VideoCamera extends ActivityBase private void updateThumbnailButton() { if (mThumbnail == null || !Util.isUriValid(mThumbnail.getUri(), mContentResolver)) { - mThumbnail = Thumbnail.getLastVideoThumbnail(mContentResolver); + mThumbnail = Thumbnail.getLastThumbnail(mContentResolver); } if (mThumbnail != null) { mThumbnailView.setBitmap(mThumbnail.getBitmap()); -- cgit v1.1