• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.gallery;
18 
19 import android.content.ContentResolver;
20 import android.database.Cursor;
21 import android.net.Uri;
22 import android.provider.MediaStore.Images.Media;
23 
24 import java.util.HashMap;
25 
26 /**
27  * Represents an ordered collection of Image objects. Provides an API to add
28  * and remove an image.
29  */
30 public class ImageList extends BaseImageList implements IImageList {
31 
32     @SuppressWarnings("unused")
33     private static final String TAG = "ImageList";
34 
35     private static final String[] ACCEPTABLE_IMAGE_TYPES =
36             new String[] { "image/jpeg", "image/png", "image/gif" };
37 
getBucketIds()38     public HashMap<String, String> getBucketIds() {
39         Uri uri = mBaseUri.buildUpon()
40                 .appendQueryParameter("distinct", "true").build();
41         Cursor cursor = Media.query(
42                 mContentResolver, uri,
43                 new String[] {
44                     Media.BUCKET_DISPLAY_NAME,
45                     Media.BUCKET_ID},
46                 whereClause(), whereClauseArgs(), null);
47         try {
48             HashMap<String, String> hash = new HashMap<String, String>();
49             while (cursor.moveToNext()) {
50                 hash.put(cursor.getString(1), cursor.getString(0));
51             }
52             return hash;
53         } finally {
54             cursor.close();
55         }
56     }
57 
58     /**
59      * ImageList constructor.
60      */
ImageList(ContentResolver resolver, Uri imageUri, int sort, String bucketId)61     public ImageList(ContentResolver resolver, Uri imageUri,
62             int sort, String bucketId) {
63         super(resolver, imageUri, sort, bucketId);
64     }
65 
66     private static final String WHERE_CLAUSE =
67             "(" + Media.MIME_TYPE + " in (?, ?, ?))";
68     private static final String WHERE_CLAUSE_WITH_BUCKET_ID =
69             WHERE_CLAUSE + " AND " + Media.BUCKET_ID + " = ?";
70 
whereClause()71     protected String whereClause() {
72         return mBucketId == null ? WHERE_CLAUSE : WHERE_CLAUSE_WITH_BUCKET_ID;
73     }
74 
whereClauseArgs()75     protected String[] whereClauseArgs() {
76         // TODO: Since mBucketId won't change, we should keep the array.
77         if (mBucketId != null) {
78             int count = ACCEPTABLE_IMAGE_TYPES.length;
79             String[] result = new String[count + 1];
80             System.arraycopy(ACCEPTABLE_IMAGE_TYPES, 0, result, 0, count);
81             result[count] = mBucketId;
82             return result;
83         }
84         return ACCEPTABLE_IMAGE_TYPES;
85     }
86 
87     @Override
createCursor()88     protected Cursor createCursor() {
89         Cursor c = Media.query(
90                 mContentResolver, mBaseUri, IMAGE_PROJECTION,
91                 whereClause(), whereClauseArgs(), sortOrder());
92         return c;
93     }
94 
95     static final String[] IMAGE_PROJECTION = new String[] {
96             Media._ID,
97             Media.DATA,
98             Media.DATE_TAKEN,
99             Media.MINI_THUMB_MAGIC,
100             Media.ORIENTATION,
101             Media.TITLE,
102             Media.MIME_TYPE,
103             Media.DATE_MODIFIED};
104 
105     private static final int INDEX_ID = 0;
106     private static final int INDEX_DATA_PATH = 1;
107     private static final int INDEX_DATE_TAKEN = 2;
108     private static final int INDEX_MINI_THUMB_MAGIC = 3;
109     private static final int INDEX_ORIENTATION = 4;
110     private static final int INDEX_TITLE = 5;
111     private static final int INDEX_MIME_TYPE = 6;
112     private static final int INDEX_DATE_MODIFIED = 7;
113 
114     @Override
getImageId(Cursor cursor)115     protected long getImageId(Cursor cursor) {
116         return cursor.getLong(INDEX_ID);
117     }
118 
119     @Override
loadImageFromCursor(Cursor cursor)120     protected BaseImage loadImageFromCursor(Cursor cursor) {
121         long id = cursor.getLong(INDEX_ID);
122         String dataPath = cursor.getString(INDEX_DATA_PATH);
123         long dateTaken = cursor.getLong(INDEX_DATE_TAKEN);
124         if (dateTaken == 0) {
125             dateTaken = cursor.getLong(INDEX_DATE_MODIFIED) * 1000;
126         }
127         long miniThumbMagic = cursor.getLong(INDEX_MINI_THUMB_MAGIC);
128         int orientation = cursor.getInt(INDEX_ORIENTATION);
129         String title = cursor.getString(INDEX_TITLE);
130         String mimeType = cursor.getString(INDEX_MIME_TYPE);
131         if (title == null || title.length() == 0) {
132             title = dataPath;
133         }
134         return new Image(this, mContentResolver, id, cursor.getPosition(),
135                 contentUri(id), dataPath, mimeType, dateTaken, title,
136                 orientation);
137     }
138 }
139