1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2011 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
1957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyanimport com.android.gallery3d.util.Future;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// ComboAlbum combines multiple media sets into one. It lists all media items
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// from the input albums.
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// This only handles SubMediaSets, not MediaItems. (That's all we need now)
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ComboAlbum extends MediaSet implements ContentListener {
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "ComboAlbum";
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final MediaSet[] mSets;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final String mName;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ComboAlbum(Path path, MediaSet[] mediaSets, String name) {
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(path, nextVersionNumber());
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSets = mediaSets;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            set.addContentListener(this);
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mName = name;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ArrayList<MediaItem> getMediaItem(int start, int count) {
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ArrayList<MediaItem> items = new ArrayList<MediaItem>();
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int size = set.getMediaItemCount();
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (count < 1) break;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (start < size) {
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int fetchCount = (start + count <= size) ? count : size - start;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ArrayList<MediaItem> fetchItems = set.getMediaItem(start, fetchCount);
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                items.addAll(fetchItems);
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                count -= fetchItems.size();
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                start = 0;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                start -= size;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return items;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getMediaItemCount() {
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = 0;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            count += set.getMediaItemCount();
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return count;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
69ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    public boolean isLeafAlbum() {
70ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen        return true;
71ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    }
72ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen
73ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    @Override
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getName() {
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mName;
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public long reload() {
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean changed = false;
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0, n = mSets.length; i < n; ++i) {
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            long version = mSets[i].reload();
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (version > mDataVersion) changed = true;
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (changed) mDataVersion = nextVersionNumber();
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mDataVersion;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onContentDirty() {
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        notifyContentChanged();
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
9257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
9357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
9457cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public Future<Integer> requestSync(SyncListener listener) {
95fe49be45412f8d0f68343662318e73822da486c8Owen Lin        return requestSyncOnMultipleSets(mSets, listener);
9657cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
98