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
216b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang// FilterTypeSet filters a base MediaSet according to a matching media type.
226b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Changpublic class FilterTypeSet extends MediaSet implements ContentListener {
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
246b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    private static final String TAG = "FilterTypeSet";
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final DataManager mDataManager;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final MediaSet mBaseSet;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final int mMediaType;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ArrayList<Path> mPaths = new ArrayList<Path>();
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ArrayList<MediaSet> mAlbums = new ArrayList<MediaSet>();
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
326b891c6a3739f8c49d42f9db6fc76cb92c7c5f25Chih-Chung Chang    public FilterTypeSet(Path path, DataManager dataManager, MediaSet baseSet,
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int mediaType) {
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(path, INVALID_DATA_VERSION);
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataManager = dataManager;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mBaseSet = baseSet;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mMediaType = mediaType;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mBaseSet.addContentListener(this);
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getName() {
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mBaseSet.getName();
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public MediaSet getSubMediaSet(int index) {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mAlbums.get(index);
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSubMediaSetCount() {
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mAlbums.size();
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getMediaItemCount() {
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mPaths.size();
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ArrayList<MediaItem> getMediaItem(int start, int count) {
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return ClusterAlbum.getMediaItemFromPath(
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mPaths, start, count, mDataManager);
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public long reload() {
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mBaseSet.reload() > mDataVersion) {
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            updateData();
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mDataVersion = nextVersionNumber();
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mDataVersion;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onContentDirty() {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        notifyContentChanged();
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void updateData() {
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // Albums
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAlbums.clear();
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String basePath = "/filter/mediatype/" + mMediaType;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0, n = mBaseSet.getSubMediaSetCount(); i < n; i++) {
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaSet set = mBaseSet.getSubMediaSet(i);
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            String filteredPath = basePath + "/{" + set.getPath().toString() + "}";
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            MediaSet filteredSet = mDataManager.getMediaSet(filteredPath);
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            filteredSet.reload();
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (filteredSet.getMediaItemCount() > 0
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    || filteredSet.getSubMediaSetCount() > 0) {
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mAlbums.add(filteredSet);
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // Items
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mPaths.clear();
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final int total = mBaseSet.getMediaItemCount();
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        final Path[] buf = new Path[total];
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mBaseSet.enumerateMediaItems(new MediaSet.ItemConsumer() {
1037817979db0c52ffeacb951625b1e821eba303285Ahbong Chang            @Override
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void consume(int index, MediaItem item) {
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (item.getMediaType() == mMediaType) {
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (index < 0 || index >= total) return;
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Path path = item.getPath();
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    buf[index] = path;
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        });
112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0; i < total; i++) {
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (buf[i] != null) {
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mPaths.add(buf[i]);
116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSupportedOperations() {
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return SUPPORT_SHARE | SUPPORT_DELETE;
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void delete() {
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ItemConsumer consumer = new ItemConsumer() {
1287817979db0c52ffeacb951625b1e821eba303285Ahbong Chang            @Override
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            public void consume(int index, MediaItem item) {
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) {
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    item.delete();
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        };
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataManager.mapMediaItems(mPaths, consumer, 0);
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
138