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