1666ea1b28a76aeba74744148b15099254d918671Owen Lin/* 2666ea1b28a76aeba74744148b15099254d918671Owen Lin * Copyright (C) 2009 The Android Open Source Project 3666ea1b28a76aeba74744148b15099254d918671Owen Lin * 4666ea1b28a76aeba74744148b15099254d918671Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5666ea1b28a76aeba74744148b15099254d918671Owen Lin * you may not use this file except in compliance with the License. 6666ea1b28a76aeba74744148b15099254d918671Owen Lin * You may obtain a copy of the License at 7666ea1b28a76aeba74744148b15099254d918671Owen Lin * 8666ea1b28a76aeba74744148b15099254d918671Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9666ea1b28a76aeba74744148b15099254d918671Owen Lin * 10666ea1b28a76aeba74744148b15099254d918671Owen Lin * Unless required by applicable law or agreed to in writing, software 11666ea1b28a76aeba74744148b15099254d918671Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12666ea1b28a76aeba74744148b15099254d918671Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13666ea1b28a76aeba74744148b15099254d918671Owen Lin * See the License for the specific language governing permissions and 14666ea1b28a76aeba74744148b15099254d918671Owen Lin * limitations under the License. 15666ea1b28a76aeba74744148b15099254d918671Owen Lin */ 16666ea1b28a76aeba74744148b15099254d918671Owen Lin 17666ea1b28a76aeba74744148b15099254d918671Owen Linpackage com.android.camera.gallery; 18666ea1b28a76aeba74744148b15099254d918671Owen Lin 19666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.content.ContentResolver; 20666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.database.Cursor; 21666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.net.Uri; 22666ea1b28a76aeba74744148b15099254d918671Owen Linimport android.provider.MediaStore.Images.Media; 23666ea1b28a76aeba74744148b15099254d918671Owen Lin 24666ea1b28a76aeba74744148b15099254d918671Owen Linimport java.util.HashMap; 25666ea1b28a76aeba74744148b15099254d918671Owen Lin 26666ea1b28a76aeba74744148b15099254d918671Owen Lin/** 27666ea1b28a76aeba74744148b15099254d918671Owen Lin * Represents an ordered collection of Image objects. Provides an API to add 28666ea1b28a76aeba74744148b15099254d918671Owen Lin * and remove an image. 29666ea1b28a76aeba74744148b15099254d918671Owen Lin */ 30666ea1b28a76aeba74744148b15099254d918671Owen Linpublic class ImageList extends BaseImageList implements IImageList { 31666ea1b28a76aeba74744148b15099254d918671Owen Lin 32666ea1b28a76aeba74744148b15099254d918671Owen Lin @SuppressWarnings("unused") 33666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final String TAG = "ImageList"; 34666ea1b28a76aeba74744148b15099254d918671Owen Lin 35666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final String[] ACCEPTABLE_IMAGE_TYPES = 36666ea1b28a76aeba74744148b15099254d918671Owen Lin new String[] { "image/jpeg", "image/png", "image/gif" }; 37666ea1b28a76aeba74744148b15099254d918671Owen Lin 38666ea1b28a76aeba74744148b15099254d918671Owen Lin public HashMap<String, String> getBucketIds() { 39666ea1b28a76aeba74744148b15099254d918671Owen Lin Uri uri = mBaseUri.buildUpon() 40666ea1b28a76aeba74744148b15099254d918671Owen Lin .appendQueryParameter("distinct", "true").build(); 41666ea1b28a76aeba74744148b15099254d918671Owen Lin Cursor cursor = Media.query( 42666ea1b28a76aeba74744148b15099254d918671Owen Lin mContentResolver, uri, 43666ea1b28a76aeba74744148b15099254d918671Owen Lin new String[] { 44666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.BUCKET_DISPLAY_NAME, 45666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.BUCKET_ID}, 46666ea1b28a76aeba74744148b15099254d918671Owen Lin whereClause(), whereClauseArgs(), null); 47666ea1b28a76aeba74744148b15099254d918671Owen Lin try { 48666ea1b28a76aeba74744148b15099254d918671Owen Lin HashMap<String, String> hash = new HashMap<String, String>(); 49666ea1b28a76aeba74744148b15099254d918671Owen Lin while (cursor.moveToNext()) { 50666ea1b28a76aeba74744148b15099254d918671Owen Lin hash.put(cursor.getString(1), cursor.getString(0)); 51666ea1b28a76aeba74744148b15099254d918671Owen Lin } 52666ea1b28a76aeba74744148b15099254d918671Owen Lin return hash; 53666ea1b28a76aeba74744148b15099254d918671Owen Lin } finally { 54666ea1b28a76aeba74744148b15099254d918671Owen Lin cursor.close(); 55666ea1b28a76aeba74744148b15099254d918671Owen Lin } 56666ea1b28a76aeba74744148b15099254d918671Owen Lin } 57666ea1b28a76aeba74744148b15099254d918671Owen Lin 58666ea1b28a76aeba74744148b15099254d918671Owen Lin /** 59666ea1b28a76aeba74744148b15099254d918671Owen Lin * ImageList constructor. 60666ea1b28a76aeba74744148b15099254d918671Owen Lin */ 61b62254a185d04ecfe2ddc837b7e0e54f0273c478Owen Lin public ImageList(ContentResolver resolver, Uri imageUri, 62666ea1b28a76aeba74744148b15099254d918671Owen Lin int sort, String bucketId) { 63666ea1b28a76aeba74744148b15099254d918671Owen Lin super(resolver, imageUri, sort, bucketId); 64666ea1b28a76aeba74744148b15099254d918671Owen Lin } 65666ea1b28a76aeba74744148b15099254d918671Owen Lin 66666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final String WHERE_CLAUSE = 67666ea1b28a76aeba74744148b15099254d918671Owen Lin "(" + Media.MIME_TYPE + " in (?, ?, ?))"; 68666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final String WHERE_CLAUSE_WITH_BUCKET_ID = 69666ea1b28a76aeba74744148b15099254d918671Owen Lin WHERE_CLAUSE + " AND " + Media.BUCKET_ID + " = ?"; 70666ea1b28a76aeba74744148b15099254d918671Owen Lin 71666ea1b28a76aeba74744148b15099254d918671Owen Lin protected String whereClause() { 72666ea1b28a76aeba74744148b15099254d918671Owen Lin return mBucketId == null ? WHERE_CLAUSE : WHERE_CLAUSE_WITH_BUCKET_ID; 73666ea1b28a76aeba74744148b15099254d918671Owen Lin } 74666ea1b28a76aeba74744148b15099254d918671Owen Lin 75666ea1b28a76aeba74744148b15099254d918671Owen Lin protected String[] whereClauseArgs() { 76666ea1b28a76aeba74744148b15099254d918671Owen Lin // TODO: Since mBucketId won't change, we should keep the array. 77666ea1b28a76aeba74744148b15099254d918671Owen Lin if (mBucketId != null) { 78666ea1b28a76aeba74744148b15099254d918671Owen Lin int count = ACCEPTABLE_IMAGE_TYPES.length; 79666ea1b28a76aeba74744148b15099254d918671Owen Lin String[] result = new String[count + 1]; 80666ea1b28a76aeba74744148b15099254d918671Owen Lin System.arraycopy(ACCEPTABLE_IMAGE_TYPES, 0, result, 0, count); 81666ea1b28a76aeba74744148b15099254d918671Owen Lin result[count] = mBucketId; 82666ea1b28a76aeba74744148b15099254d918671Owen Lin return result; 83666ea1b28a76aeba74744148b15099254d918671Owen Lin } 84666ea1b28a76aeba74744148b15099254d918671Owen Lin return ACCEPTABLE_IMAGE_TYPES; 85666ea1b28a76aeba74744148b15099254d918671Owen Lin } 86666ea1b28a76aeba74744148b15099254d918671Owen Lin 87666ea1b28a76aeba74744148b15099254d918671Owen Lin @Override 88666ea1b28a76aeba74744148b15099254d918671Owen Lin protected Cursor createCursor() { 89666ea1b28a76aeba74744148b15099254d918671Owen Lin Cursor c = Media.query( 90666ea1b28a76aeba74744148b15099254d918671Owen Lin mContentResolver, mBaseUri, IMAGE_PROJECTION, 91666ea1b28a76aeba74744148b15099254d918671Owen Lin whereClause(), whereClauseArgs(), sortOrder()); 92666ea1b28a76aeba74744148b15099254d918671Owen Lin return c; 93666ea1b28a76aeba74744148b15099254d918671Owen Lin } 94666ea1b28a76aeba74744148b15099254d918671Owen Lin 95666ea1b28a76aeba74744148b15099254d918671Owen Lin static final String[] IMAGE_PROJECTION = new String[] { 96666ea1b28a76aeba74744148b15099254d918671Owen Lin Media._ID, 97666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.DATA, 98666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.DATE_TAKEN, 99666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.MINI_THUMB_MAGIC, 100666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.ORIENTATION, 101666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.TITLE, 102666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.MIME_TYPE, 103666ea1b28a76aeba74744148b15099254d918671Owen Lin Media.DATE_MODIFIED}; 104666ea1b28a76aeba74744148b15099254d918671Owen Lin 105666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_ID = 0; 106666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_DATA_PATH = 1; 107666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_DATE_TAKEN = 2; 108666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_MINI_THUMB_MAGIC = 3; 109666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_ORIENTATION = 4; 110666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_TITLE = 5; 111666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_MIME_TYPE = 6; 112666ea1b28a76aeba74744148b15099254d918671Owen Lin private static final int INDEX_DATE_MODIFIED = 7; 113666ea1b28a76aeba74744148b15099254d918671Owen Lin 114666ea1b28a76aeba74744148b15099254d918671Owen Lin @Override 115666ea1b28a76aeba74744148b15099254d918671Owen Lin protected long getImageId(Cursor cursor) { 116666ea1b28a76aeba74744148b15099254d918671Owen Lin return cursor.getLong(INDEX_ID); 117666ea1b28a76aeba74744148b15099254d918671Owen Lin } 118666ea1b28a76aeba74744148b15099254d918671Owen Lin 119666ea1b28a76aeba74744148b15099254d918671Owen Lin @Override 120666ea1b28a76aeba74744148b15099254d918671Owen Lin protected BaseImage loadImageFromCursor(Cursor cursor) { 121666ea1b28a76aeba74744148b15099254d918671Owen Lin long id = cursor.getLong(INDEX_ID); 122666ea1b28a76aeba74744148b15099254d918671Owen Lin String dataPath = cursor.getString(INDEX_DATA_PATH); 123666ea1b28a76aeba74744148b15099254d918671Owen Lin long dateTaken = cursor.getLong(INDEX_DATE_TAKEN); 124666ea1b28a76aeba74744148b15099254d918671Owen Lin if (dateTaken == 0) { 125666ea1b28a76aeba74744148b15099254d918671Owen Lin dateTaken = cursor.getLong(INDEX_DATE_MODIFIED) * 1000; 126666ea1b28a76aeba74744148b15099254d918671Owen Lin } 127666ea1b28a76aeba74744148b15099254d918671Owen Lin long miniThumbMagic = cursor.getLong(INDEX_MINI_THUMB_MAGIC); 128666ea1b28a76aeba74744148b15099254d918671Owen Lin int orientation = cursor.getInt(INDEX_ORIENTATION); 129666ea1b28a76aeba74744148b15099254d918671Owen Lin String title = cursor.getString(INDEX_TITLE); 130666ea1b28a76aeba74744148b15099254d918671Owen Lin String mimeType = cursor.getString(INDEX_MIME_TYPE); 131666ea1b28a76aeba74744148b15099254d918671Owen Lin if (title == null || title.length() == 0) { 132666ea1b28a76aeba74744148b15099254d918671Owen Lin title = dataPath; 133666ea1b28a76aeba74744148b15099254d918671Owen Lin } 134666ea1b28a76aeba74744148b15099254d918671Owen Lin return new Image(this, mContentResolver, id, cursor.getPosition(), 135b62254a185d04ecfe2ddc837b7e0e54f0273c478Owen Lin contentUri(id), dataPath, mimeType, dateTaken, title, 136185a1a7c5f33ecc5cb9a36d23cecb719c8727178Chih-Chung Chang orientation); 137666ea1b28a76aeba74744148b15099254d918671Owen Lin } 138666ea1b28a76aeba74744148b15099254d918671Owen Lin} 139