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