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 {
277817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @SuppressWarnings("unused")
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "ComboAlbum";
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final MediaSet[] mSets;
30ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu    private String mName;
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ComboAlbum(Path path, MediaSet[] mediaSets, String name) {
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(path, nextVersionNumber());
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSets = mediaSets;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            set.addContentListener(this);
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mName = name;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ArrayList<MediaItem> getMediaItem(int start, int count) {
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ArrayList<MediaItem> items = new ArrayList<MediaItem>();
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int size = set.getMediaItemCount();
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (count < 1) break;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (start < size) {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int fetchCount = (start + count <= size) ? count : size - start;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                ArrayList<MediaItem> fetchItems = set.getMediaItem(start, fetchCount);
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                items.addAll(fetchItems);
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                count -= fetchItems.size();
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                start = 0;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                start -= size;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return items;
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getMediaItemCount() {
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = 0;
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            count += set.getMediaItemCount();
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return count;
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
70ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    public boolean isLeafAlbum() {
71ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen        return true;
72ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    }
73ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen
74ad790f2e24837eca6cc6e2b3622f32b3a750c74bRay Chen    @Override
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getName() {
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mName;
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
79ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu    public void useNameOfChild(int i) {
80ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu        if (i < mSets.length) mName = mSets[i].getName();
81ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu    }
82ee899c09c88e5b054397ac44ad20e5055cd24f39Bobby Georgescu
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
84705dc819661cb8c8e839a04577b0641bd6caad53John Reck    public long reload() {
85705dc819661cb8c8e839a04577b0641bd6caad53John Reck        boolean changed = false;
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0, n = mSets.length; i < n; ++i) {
87705dc819661cb8c8e839a04577b0641bd6caad53John Reck            long version = mSets[i].reload();
88705dc819661cb8c8e839a04577b0641bd6caad53John Reck            if (version > mDataVersion) changed = true;
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
90705dc819661cb8c8e839a04577b0641bd6caad53John Reck        if (changed) mDataVersion = nextVersionNumber();
91705dc819661cb8c8e839a04577b0641bd6caad53John Reck        return mDataVersion;
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
947817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @Override
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onContentDirty() {
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        notifyContentChanged();
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
9857cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
9957cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
10057cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public Future<Integer> requestSync(SyncListener listener) {
101fe49be45412f8d0f68343662318e73822da486c8Owen Lin        return requestSyncOnMultipleSets(mSets, listener);
10257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
104