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 21705dc819661cb8c8e839a04577b0641bd6caad53John Reckpublic class ClusterAlbum extends MediaSet implements ContentListener { 227817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @SuppressWarnings("unused") 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "ClusterAlbum"; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ArrayList<Path> mPaths = new ArrayList<Path>(); 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String mName = ""; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private DataManager mDataManager; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private MediaSet mClusterAlbumSet; 2804a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen private MediaItem mCover; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ClusterAlbum(Path path, DataManager dataManager, 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet clusterAlbumSet) { 32705dc819661cb8c8e839a04577b0641bd6caad53John Reck super(path, nextVersionNumber()); 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataManager = dataManager; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mClusterAlbumSet = clusterAlbumSet; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mClusterAlbumSet.addContentListener(this); 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3804a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen public void setCoverMediaItem(MediaItem cover) { 3904a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen mCover = cover; 4004a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen } 4104a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen 4204a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen @Override 4304a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen public MediaItem getCoverMediaItem() { 4404a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen return mCover != null ? mCover : super.getCoverMediaItem(); 4504a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen } 4604a9a44fb85263c4590ca68f92adff6f9da360e9Ray Chen 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin void setMediaItems(ArrayList<Path> paths) { 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mPaths = paths; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<Path> getMediaItems() { 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mPaths; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setName(String name) { 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mName = name; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String getName() { 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mName; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getMediaItemCount() { 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mPaths.size(); 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ArrayList<MediaItem> getMediaItem(int start, int count) { 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return getMediaItemFromPath(mPaths, start, count, mDataManager); 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static ArrayList<MediaItem> getMediaItemFromPath( 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<Path> paths, int start, int count, 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager dataManager) { 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (start >= paths.size()) { 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return new ArrayList<MediaItem>(); 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int end = Math.min(start + count, paths.size()); 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<Path> subset = new ArrayList<Path>(paths.subList(start, end)); 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin final MediaItem[] buf = new MediaItem[end - start]; 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ItemConsumer consumer = new ItemConsumer() { 847817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void consume(int index, MediaItem item) { 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin buf[index] = item; 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin dataManager.mapMediaItems(subset, consumer, 0); 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<MediaItem> result = new ArrayList<MediaItem>(end - start); 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0; i < buf.length; i++) { 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin result.add(buf[i]); 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return result; 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected int enumerateMediaItems(ItemConsumer consumer, int startIndex) { 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataManager.mapMediaItems(mPaths, consumer, startIndex); 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mPaths.size(); 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getTotalMediaItemCount() { 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mPaths.size(); 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 109705dc819661cb8c8e839a04577b0641bd6caad53John Reck public long reload() { 110705dc819661cb8c8e839a04577b0641bd6caad53John Reck if (mClusterAlbumSet.reload() > mDataVersion) { 111705dc819661cb8c8e839a04577b0641bd6caad53John Reck mDataVersion = nextVersionNumber(); 112705dc819661cb8c8e839a04577b0641bd6caad53John Reck } 113705dc819661cb8c8e839a04577b0641bd6caad53John Reck return mDataVersion; 114705dc819661cb8c8e839a04577b0641bd6caad53John Reck } 115705dc819661cb8c8e839a04577b0641bd6caad53John Reck 116705dc819661cb8c8e839a04577b0641bd6caad53John Reck @Override 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onContentDirty() { 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifyContentChanged(); 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getSupportedOperations() { 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SUPPORT_SHARE | SUPPORT_DELETE | SUPPORT_INFO; 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void delete() { 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ItemConsumer consumer = new ItemConsumer() { 1297817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void consume(int index, MediaItem item) { 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) { 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.delete(); 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataManager.mapMediaItems(mPaths, consumer, 0); 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isLeafAlbum() { 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 144