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 17 package com.android.gallery3d.data; 18 19 import java.util.ArrayList; 20 21 public class ClusterAlbum extends MediaSet implements ContentListener { 22 private static final String TAG = "ClusterAlbum"; 23 private ArrayList<Path> mPaths = new ArrayList<Path>(); 24 private String mName = ""; 25 private DataManager mDataManager; 26 private MediaSet mClusterAlbumSet; 27 private MediaItem mCover; 28 ClusterAlbum(Path path, DataManager dataManager, MediaSet clusterAlbumSet)29 public ClusterAlbum(Path path, DataManager dataManager, 30 MediaSet clusterAlbumSet) { 31 super(path, nextVersionNumber()); 32 mDataManager = dataManager; 33 mClusterAlbumSet = clusterAlbumSet; 34 mClusterAlbumSet.addContentListener(this); 35 } 36 setCoverMediaItem(MediaItem cover)37 public void setCoverMediaItem(MediaItem cover) { 38 mCover = cover; 39 } 40 41 @Override getCoverMediaItem()42 public MediaItem getCoverMediaItem() { 43 return mCover != null ? mCover : super.getCoverMediaItem(); 44 } 45 setMediaItems(ArrayList<Path> paths)46 void setMediaItems(ArrayList<Path> paths) { 47 mPaths = paths; 48 } 49 getMediaItems()50 ArrayList<Path> getMediaItems() { 51 return mPaths; 52 } 53 setName(String name)54 public void setName(String name) { 55 mName = name; 56 } 57 58 @Override getName()59 public String getName() { 60 return mName; 61 } 62 63 @Override getMediaItemCount()64 public int getMediaItemCount() { 65 return mPaths.size(); 66 } 67 68 @Override getMediaItem(int start, int count)69 public ArrayList<MediaItem> getMediaItem(int start, int count) { 70 return getMediaItemFromPath(mPaths, start, count, mDataManager); 71 } 72 getMediaItemFromPath( ArrayList<Path> paths, int start, int count, DataManager dataManager)73 public static ArrayList<MediaItem> getMediaItemFromPath( 74 ArrayList<Path> paths, int start, int count, 75 DataManager dataManager) { 76 if (start >= paths.size()) { 77 return new ArrayList<MediaItem>(); 78 } 79 int end = Math.min(start + count, paths.size()); 80 ArrayList<Path> subset = new ArrayList<Path>(paths.subList(start, end)); 81 final MediaItem[] buf = new MediaItem[end - start]; 82 ItemConsumer consumer = new ItemConsumer() { 83 public void consume(int index, MediaItem item) { 84 buf[index] = item; 85 } 86 }; 87 dataManager.mapMediaItems(subset, consumer, 0); 88 ArrayList<MediaItem> result = new ArrayList<MediaItem>(end - start); 89 for (int i = 0; i < buf.length; i++) { 90 result.add(buf[i]); 91 } 92 return result; 93 } 94 95 @Override enumerateMediaItems(ItemConsumer consumer, int startIndex)96 protected int enumerateMediaItems(ItemConsumer consumer, int startIndex) { 97 mDataManager.mapMediaItems(mPaths, consumer, startIndex); 98 return mPaths.size(); 99 } 100 101 @Override getTotalMediaItemCount()102 public int getTotalMediaItemCount() { 103 return mPaths.size(); 104 } 105 106 @Override reload()107 public long reload() { 108 if (mClusterAlbumSet.reload() > mDataVersion) { 109 mDataVersion = nextVersionNumber(); 110 } 111 return mDataVersion; 112 } 113 onContentDirty()114 public void onContentDirty() { 115 notifyContentChanged(); 116 } 117 118 @Override getSupportedOperations()119 public int getSupportedOperations() { 120 return SUPPORT_SHARE | SUPPORT_DELETE | SUPPORT_INFO; 121 } 122 123 @Override delete()124 public void delete() { 125 ItemConsumer consumer = new ItemConsumer() { 126 public void consume(int index, MediaItem item) { 127 if ((item.getSupportedOperations() & SUPPORT_DELETE) != 0) { 128 item.delete(); 129 } 130 } 131 }; 132 mDataManager.mapMediaItems(mPaths, consumer, 0); 133 } 134 135 @Override isLeafAlbum()136 public boolean isLeafAlbum() { 137 return true; 138 } 139 } 140