1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryApp; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.GalleryUtils; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentResolver; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.Cursor; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Images; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Images.ImageColumns; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Video; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Video.VideoColumns; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// LocalAlbumSet lists all media items in one bucket on local storage. 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// The media items need to be all images or all videos, but not both. 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class LocalAlbum extends MediaSet { 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "LocalAlbum"; 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String[] COUNT_PROJECTION = { "count(*)" }; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int INVALID_COUNT = -1; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String mWhereClause; 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String mOrderClause; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Uri mBaseUri; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String[] mProjection; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final GalleryApp mApplication; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final ContentResolver mResolver; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mBucketId; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final String mBucketName; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final boolean mIsImage; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final ChangeNotifier mNotifier; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Path mItemPath; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mCachedCount = INVALID_COUNT; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public LocalAlbum(Path path, GalleryApp application, int bucketId, 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean isImage, String name) { 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super(path, nextVersionNumber()); 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mApplication = application; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResolver = application.getContentResolver(); 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBucketId = bucketId; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBucketName = name; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsImage = isImage; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isImage) { 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWhereClause = ImageColumns.BUCKET_ID + " = ?"; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mOrderClause = ImageColumns.DATE_TAKEN + " DESC, " 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + ImageColumns._ID + " DESC"; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBaseUri = Images.Media.EXTERNAL_CONTENT_URI; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mProjection = LocalImage.PROJECTION; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mItemPath = LocalImage.ITEM_PATH; 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWhereClause = VideoColumns.BUCKET_ID + " = ?"; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mOrderClause = VideoColumns.DATE_TAKEN + " DESC, " 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin + VideoColumns._ID + " DESC"; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBaseUri = Video.Media.EXTERNAL_CONTENT_URI; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mProjection = LocalVideo.PROJECTION; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mItemPath = LocalVideo.ITEM_PATH; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mNotifier = new ChangeNotifier(this, mBaseUri, application); 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public LocalAlbum(Path path, GalleryApp application, int bucketId, 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean isImage) { 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin this(path, application, bucketId, isImage, 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin LocalAlbumSet.getBucketName(application.getContentResolver(), 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin bucketId)); 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ArrayList<MediaItem> getMediaItem(int start, int count) { 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager dataManager = mApplication.getDataManager(); 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Uri uri = mBaseUri.buildUpon() 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .appendQueryParameter("limit", start + "," + count).build(); 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<MediaItem> list = new ArrayList<MediaItem>(); 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.assertNotInRenderThread(); 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Cursor cursor = mResolver.query( 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin uri, mProjection, mWhereClause, 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[]{String.valueOf(mBucketId)}, 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mOrderClause); 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (cursor == null) { 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "query fail: " + uri); 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return list; 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (cursor.moveToNext()) { 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int id = cursor.getInt(0); // _id must be in the first column 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path childPath = mItemPath.getChild(id); 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = loadOrUpdateItem(childPath, cursor, 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin dataManager, mApplication, mIsImage); 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin list.add(item); 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cursor.close(); 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return list; 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static MediaItem loadOrUpdateItem(Path path, Cursor cursor, 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager dataManager, GalleryApp app, boolean isImage) { 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin LocalMediaItem item = (LocalMediaItem) dataManager.peekMediaObject(path); 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (item == null) { 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isImage) { 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item = new LocalImage(path, app, cursor); 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item = new LocalVideo(path, app, cursor); 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.updateContent(cursor); 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return item; 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // The pids array are sorted by the (path) id. 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static MediaItem[] getMediaItemById( 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryApp application, boolean isImage, ArrayList<Integer> ids) { 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // get the lower and upper bound of (path) id 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem[] result = new MediaItem[ids.size()]; 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ids.isEmpty()) return result; 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int idLow = ids.get(0); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int idHigh = ids.get(ids.size() - 1); 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // prepare the query parameters 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Uri baseUri; 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String[] projection; 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path itemPath; 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isImage) { 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin baseUri = Images.Media.EXTERNAL_CONTENT_URI; 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin projection = LocalImage.PROJECTION; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin itemPath = LocalImage.ITEM_PATH; 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin baseUri = Video.Media.EXTERNAL_CONTENT_URI; 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin projection = LocalVideo.PROJECTION; 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin itemPath = LocalVideo.ITEM_PATH; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ContentResolver resolver = application.getContentResolver(); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager dataManager = application.getDataManager(); 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Cursor cursor = resolver.query(baseUri, projection, "_id BETWEEN ? AND ?", 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[]{String.valueOf(idLow), String.valueOf(idHigh)}, 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "_id"); 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (cursor == null) { 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "query fail" + baseUri); 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return result; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int n = ids.size(); 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int i = 0; 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (i < n && cursor.moveToNext()) { 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int id = cursor.getInt(0); // _id must be in the first column 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Match id with the one on the ids list. 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (ids.get(i) > id) { 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin continue; 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (ids.get(i) < id) { 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (++i >= n) { 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return result; 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path childPath = itemPath.getChild(id); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem item = loadOrUpdateItem(childPath, cursor, dataManager, 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin application, isImage); 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin result[i] = item; 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ++i; 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return result; 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cursor.close(); 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static Cursor getItemCursor(ContentResolver resolver, Uri uri, 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String[] projection, int id) { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return resolver.query(uri, projection, "_id=?", 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[]{String.valueOf(id)}, null); 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getMediaItemCount() { 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCachedCount == INVALID_COUNT) { 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Cursor cursor = mResolver.query( 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mBaseUri, COUNT_PROJECTION, mWhereClause, 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[]{String.valueOf(mBucketId)}, null); 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (cursor == null) { 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, "query fail"); 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return 0; 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.assertTrue(cursor.moveToNext()); 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCachedCount = cursor.getInt(0); 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cursor.close(); 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mCachedCount; 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String getName() { 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mBucketName; 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public long reload() { 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mNotifier.isDirty()) { 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataVersion = nextVersionNumber(); 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCachedCount = INVALID_COUNT; 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mDataVersion; 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getSupportedOperations() { 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_INFO; 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void delete() { 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryUtils.assertNotInRenderThread(); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mResolver.delete(mBaseUri, mWhereClause, 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new String[]{String.valueOf(mBucketId)}); 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isLeafAlbum() { 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 253