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 java.util.ArrayList;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
21705dc819661cb8c8e839a04577b0641bd6caad53John Reckpublic class ClusterAlbum extends MediaSet implements ContentListener {
227817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @SuppressWarnings("unused")
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "ClusterAlbum";
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ArrayList<Path> mPaths = new ArrayList<Path>();
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private String mName = "";
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private DataManager mDataManager;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mClusterAlbumSet;
2804a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    private MediaItem mCover;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ClusterAlbum(Path path, DataManager dataManager,
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaSet clusterAlbumSet) {
32705dc819661cb8c8e839a04577b0641bd6caad53John Reck        super(path, nextVersionNumber());
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataManager = dataManager;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClusterAlbumSet = clusterAlbumSet;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClusterAlbumSet.addContentListener(this);
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
3804a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    public void setCoverMediaItem(MediaItem cover) {
3904a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen        mCover = cover;
4004a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    }
4104a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen
4204a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    @Override
4304a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    public MediaItem getCoverMediaItem() {
4404a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen        return mCover != null ? mCover : super.getCoverMediaItem();
4504a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen    }
4604a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    void setMediaItems(ArrayList<Path> paths) {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPaths = paths;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    ArrayList<Path> getMediaItems() {
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mPaths;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setName(String name) {
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mName = name;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getName() {
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mName;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getMediaItemCount() {
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mPaths.size();
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ArrayList<MediaItem> getMediaItem(int start, int count) {
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return getMediaItemFromPath(mPaths, start, count, mDataManager);
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static ArrayList<MediaItem> getMediaItemFromPath(
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            ArrayList<Path> paths, int start, int count,
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            DataManager dataManager) {
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (start >= paths.size()) {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return new ArrayList<MediaItem>();
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int end = Math.min(start + count, paths.size());
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ArrayList<Path> subset = new ArrayList<Path>(paths.subList(start, end));
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final MediaItem[] buf = new MediaItem[end - start];
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ItemConsumer consumer = new ItemConsumer() {
847817979db0c52ffeacb951625b1e821eba303285Ahbong Chang            @Override
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void consume(int index, MediaItem item) {
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                buf[index] = item;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        dataManager.mapMediaItems(subset, consumer, 0);
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ArrayList<MediaItem> result = new ArrayList<MediaItem>(end - start);
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0; i < buf.length; i++) {
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            result.add(buf[i]);
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return result;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected int enumerateMediaItems(ItemConsumer consumer, int startIndex) {
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataManager.mapMediaItems(mPaths, consumer, startIndex);
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mPaths.size();
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getTotalMediaItemCount() {
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mPaths.size();
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
109705dc819661cb8c8e839a04577b0641bd6caad53John Reck    public long reload() {
110705dc819661cb8c8e839a04577b0641bd6caad53John Reck        if (mClusterAlbumSet.reload() > mDataVersion) {
111705dc819661cb8c8e839a04577b0641bd6caad53John Reck            mDataVersion = nextVersionNumber();
112705dc819661cb8c8e839a04577b0641bd6caad53John Reck        }
113705dc819661cb8c8e839a04577b0641bd6caad53John Reck        return mDataVersion;
114705dc819661cb8c8e839a04577b0641bd6caad53John Reck    }
115705dc819661cb8c8e839a04577b0641bd6caad53John Reck
116705dc819661cb8c8e839a04577b0641bd6caad53John Reck    @Override
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onContentDirty() {
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        notifyContentChanged();
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSupportedOperations() {
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return SUPPORT_SHARE | SUPPORT_DELETE | SUPPORT_INFO;
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void delete() {
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ItemConsumer consumer = new ItemConsumer() {
1297817979db0c52ffeacb951625b1e821eba303285Ahbong Chang            @Override
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void consume(int index, MediaItem item) {
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) {
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    item.delete();
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataManager.mapMediaItems(mPaths, consumer, 0);
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean isLeafAlbum() {
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return true;
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
144