1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.gallery3d.data; 18 19import java.util.ArrayList; 20 21// FilterTypeSet filters a base MediaSet according to a matching media type. 22public class FilterTypeSet extends MediaSet implements ContentListener { 23 @SuppressWarnings("unused") 24 private static final String TAG = "FilterTypeSet"; 25 26 private final DataManager mDataManager; 27 private final MediaSet mBaseSet; 28 private final int mMediaType; 29 private final ArrayList<Path> mPaths = new ArrayList<Path>(); 30 private final ArrayList<MediaSet> mAlbums = new ArrayList<MediaSet>(); 31 32 public FilterTypeSet(Path path, DataManager dataManager, MediaSet baseSet, 33 int mediaType) { 34 super(path, INVALID_DATA_VERSION); 35 mDataManager = dataManager; 36 mBaseSet = baseSet; 37 mMediaType = mediaType; 38 mBaseSet.addContentListener(this); 39 } 40 41 @Override 42 public String getName() { 43 return mBaseSet.getName(); 44 } 45 46 @Override 47 public MediaSet getSubMediaSet(int index) { 48 return mAlbums.get(index); 49 } 50 51 @Override 52 public int getSubMediaSetCount() { 53 return mAlbums.size(); 54 } 55 56 @Override 57 public int getMediaItemCount() { 58 return mPaths.size(); 59 } 60 61 @Override 62 public ArrayList<MediaItem> getMediaItem(int start, int count) { 63 return ClusterAlbum.getMediaItemFromPath( 64 mPaths, start, count, mDataManager); 65 } 66 67 @Override 68 public long reload() { 69 if (mBaseSet.reload() > mDataVersion) { 70 updateData(); 71 mDataVersion = nextVersionNumber(); 72 } 73 return mDataVersion; 74 } 75 76 @Override 77 public void onContentDirty() { 78 notifyContentChanged(); 79 } 80 81 private void updateData() { 82 // Albums 83 mAlbums.clear(); 84 String basePath = "/filter/mediatype/" + mMediaType; 85 86 for (int i = 0, n = mBaseSet.getSubMediaSetCount(); i < n; i++) { 87 MediaSet set = mBaseSet.getSubMediaSet(i); 88 String filteredPath = basePath + "/{" + set.getPath().toString() + "}"; 89 MediaSet filteredSet = mDataManager.getMediaSet(filteredPath); 90 filteredSet.reload(); 91 if (filteredSet.getMediaItemCount() > 0 92 || filteredSet.getSubMediaSetCount() > 0) { 93 mAlbums.add(filteredSet); 94 } 95 } 96 97 // Items 98 mPaths.clear(); 99 final int total = mBaseSet.getMediaItemCount(); 100 final Path[] buf = new Path[total]; 101 102 mBaseSet.enumerateMediaItems(new MediaSet.ItemConsumer() { 103 @Override 104 public void consume(int index, MediaItem item) { 105 if (item.getMediaType() == mMediaType) { 106 if (index < 0 || index >= total) return; 107 Path path = item.getPath(); 108 buf[index] = path; 109 } 110 } 111 }); 112 113 for (int i = 0; i < total; i++) { 114 if (buf[i] != null) { 115 mPaths.add(buf[i]); 116 } 117 } 118 } 119 120 @Override 121 public int getSupportedOperations() { 122 return SUPPORT_SHARE | SUPPORT_DELETE; 123 } 124 125 @Override 126 public void delete() { 127 ItemConsumer consumer = new ItemConsumer() { 128 @Override 129 public void consume(int index, MediaItem item) { 130 if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) { 131 item.delete(); 132 } 133 } 134 }; 135 mDataManager.mapMediaItems(mPaths, consumer, 0); 136 } 137} 138