1/*
2 * Copyright (C) 2010 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
17package com.android.gallery3d.data;
18
19import java.util.ArrayList;
20
21public class ClusterAlbum extends MediaSet implements ContentListener {
22    @SuppressWarnings("unused")
23    private static final String TAG = "ClusterAlbum";
24    private ArrayList<Path> mPaths = new ArrayList<Path>();
25    private String mName = "";
26    private DataManager mDataManager;
27    private MediaSet mClusterAlbumSet;
28    private MediaItem mCover;
29
30    public ClusterAlbum(Path path, DataManager dataManager,
31            MediaSet clusterAlbumSet) {
32        super(path, nextVersionNumber());
33        mDataManager = dataManager;
34        mClusterAlbumSet = clusterAlbumSet;
35        mClusterAlbumSet.addContentListener(this);
36    }
37
38    public void setCoverMediaItem(MediaItem cover) {
39        mCover = cover;
40    }
41
42    @Override
43    public MediaItem getCoverMediaItem() {
44        return mCover != null ? mCover : super.getCoverMediaItem();
45    }
46
47    void setMediaItems(ArrayList<Path> paths) {
48        mPaths = paths;
49    }
50
51    ArrayList<Path> getMediaItems() {
52        return mPaths;
53    }
54
55    public void setName(String name) {
56        mName = name;
57    }
58
59    @Override
60    public String getName() {
61        return mName;
62    }
63
64    @Override
65    public int getMediaItemCount() {
66        return mPaths.size();
67    }
68
69    @Override
70    public ArrayList<MediaItem> getMediaItem(int start, int count) {
71        return getMediaItemFromPath(mPaths, start, count, mDataManager);
72    }
73
74    public static ArrayList<MediaItem> getMediaItemFromPath(
75            ArrayList<Path> paths, int start, int count,
76            DataManager dataManager) {
77        if (start >= paths.size()) {
78            return new ArrayList<MediaItem>();
79        }
80        int end = Math.min(start + count, paths.size());
81        ArrayList<Path> subset = new ArrayList<Path>(paths.subList(start, end));
82        final MediaItem[] buf = new MediaItem[end - start];
83        ItemConsumer consumer = new ItemConsumer() {
84            @Override
85            public void consume(int index, MediaItem item) {
86                buf[index] = item;
87            }
88        };
89        dataManager.mapMediaItems(subset, consumer, 0);
90        ArrayList<MediaItem> result = new ArrayList<MediaItem>(end - start);
91        for (int i = 0; i < buf.length; i++) {
92            result.add(buf[i]);
93        }
94        return result;
95    }
96
97    @Override
98    protected int enumerateMediaItems(ItemConsumer consumer, int startIndex) {
99        mDataManager.mapMediaItems(mPaths, consumer, startIndex);
100        return mPaths.size();
101    }
102
103    @Override
104    public int getTotalMediaItemCount() {
105        return mPaths.size();
106    }
107
108    @Override
109    public long reload() {
110        if (mClusterAlbumSet.reload() > mDataVersion) {
111            mDataVersion = nextVersionNumber();
112        }
113        return mDataVersion;
114    }
115
116    @Override
117    public void onContentDirty() {
118        notifyContentChanged();
119    }
120
121    @Override
122    public int getSupportedOperations() {
123        return SUPPORT_SHARE | SUPPORT_DELETE | SUPPORT_INFO;
124    }
125
126    @Override
127    public void delete() {
128        ItemConsumer consumer = new ItemConsumer() {
129            @Override
130            public void consume(int index, MediaItem item) {
131                if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) {
132                    item.delete();
133                }
134            }
135        };
136        mDataManager.mapMediaItems(mPaths, consumer, 0);
137    }
138
139    @Override
140    public boolean isLeafAlbum() {
141        return true;
142    }
143}
144