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.R;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryApp;
2157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyanimport com.android.gallery3d.util.Future;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// ComboAlbumSet combines multiple media sets into one. It lists all sub
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// media sets from the input album sets.
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// This only handles SubMediaSets, not MediaItems. (That's all we need now)
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ComboAlbumSet extends MediaSet implements ContentListener {
277817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @SuppressWarnings("unused")
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "ComboAlbumSet";
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final MediaSet[] mSets;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final String mName;
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ComboAlbumSet(Path path, GalleryApp application, MediaSet[] mediaSets) {
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 = application.getResources().getString(
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                R.string.set_label_all_albums);
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public MediaSet getSubMediaSet(int index) {
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int size = set.getSubMediaSetCount();
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (index < size) {
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                return set.getSubMediaSet(index);
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            index -= size;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return null;
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSubMediaSetCount() {
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = 0;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (MediaSet set : mSets) {
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            count += set.getSubMediaSetCount();
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return count;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getName() {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mName;
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
69e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen    public boolean isLoading() {
70e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen        for (int i = 0, n = mSets.length; i < n; ++i) {
71e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen            if (mSets[i].isLoading()) return true;
72e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen        }
73e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen        return false;
74e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen    }
75e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen
76e8c1e69f85efb8673d0606f3aca729a366038753Ray Chen    @Override
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public long reload() {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        boolean changed = false;
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0, n = mSets.length; i < n; ++i) {
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            long version = mSets[i].reload();
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (version > mDataVersion) changed = true;
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (changed) mDataVersion = nextVersionNumber();
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mDataVersion;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
877817979db0c52ffeacb951625b1e821eba303285Ahbong Chang    @Override
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onContentDirty() {
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        notifyContentChanged();
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
9157cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan
9257cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    @Override
9357cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    public Future<Integer> requestSync(SyncListener listener) {
94fe49be45412f8d0f68343662318e73822da486c8Owen Lin        return requestSyncOnMultipleSets(mSets, listener);
9557cbaa1ef40d2215c6400f5ae4af3a09e67abb2dHung-ying Tyan    }
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
97