1 /*** 2 * Ambient - A music player for the Android platform 3 Copyright (C) 2007 Martin Vysny 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 package sk.baka.ambient.collection; 20 21 import java.util.Collection; 22 import java.util.List; 23 import java.util.Map; 24 25 import sk.baka.ambient.collection.ampache.AmpacheServer; 26 import sk.baka.ambient.playlist.Random; 27 import android.media.MediaPlayer; 28 29 /*** 30 * <p> 31 * A collection strategy. Allows read-only access to underlying storage of 32 * artists, albums, tracks and genres. 33 * </p> 34 * <p> 35 * The implementation must be thread-safe - any method may be called from 36 * multiple threads at once. The methods should periodically check for 37 * interrupted state and throw {@link InterruptedException} (or other kind of 38 * exception) if they are interrupted. 39 * </p> 40 * 41 * @author Martin Vysny 42 */ 43 public interface ICollection { 44 /*** 45 * Checks if the underlying strategy uses local resources to retrieve 46 * metadata (a DB backend), or it uses remote access to a server (for 47 * example Ampache). 48 * 49 * @return <code>true</code> if the collection queries will tend to be 50 * performed fast, <code>false</code> otherwise. 51 */ 52 boolean isLocal(); 53 54 /*** 55 * Returns short descriptive name of this collection backend. 56 * 57 * @return the name. 58 */ 59 String getName(); 60 61 /*** 62 * Returns all tracks contained in given category. 63 * 64 * @param context 65 * search in context of this item. Must not be <code>null</code>. 66 * @return list of tracks, sorted in no particular order. Must not be 67 * <code>null</code>, may be empty. 68 * @throws CollectionException 69 * thrown when the collection fails to return items. 70 * @throws InterruptedException 71 * when interrupted. 72 */ 73 List<TrackMetadataBean> getTracks(final CategoryItem context) 74 throws CollectionException, InterruptedException; 75 76 /*** 77 * Returns category list matching given criteria. Returns sorted list, 78 * either by name or by the year. 79 * 80 * @param request 81 * the category to search for. Must not be <code>null</code>. 82 * @param context 83 * search in context of this item. May be <code>null</code> - in 84 * this case all categories are returned. 85 * @param substring 86 * if not <code>null</code> then all category names must contain 87 * this substring. 88 * @param sortByYear 89 * if <code>true</code> then the result category list is sorted 90 * by year, then by name. If <code>false</code> then sorted only 91 * by name. Ignored when the <code>request</code> parameter is 92 * not an album. 93 * @return list of categories. Must not be <code>null</code>, may be empty. 94 * @throws CollectionException 95 * thrown when the collection fails to return items. 96 * @throws InterruptedException 97 * when interrupted. 98 */ 99 List<CategoryItem> getCategoryList(final CategoryEnum request, 100 final CategoryItem context, final String substring, 101 final boolean sortByYear) throws CollectionException, 102 InterruptedException; 103 104 /*** 105 * Search song which Song Title, Artist Name, Album Name or Genre Name 106 * contains given substring. 107 * 108 * @param substring 109 * the substring to search for. 110 * @return the list of tracks. Must not be <code>null</code>, may be empty. 111 * Sorted in no particular order. 112 * @throws CollectionException 113 * thrown when the collection fails to return items. 114 * @throws InterruptedException 115 * when interrupted. 116 */ 117 List<TrackMetadataBean> searchTracks(final String substring) 118 throws CollectionException, InterruptedException; 119 120 /*** 121 * Returns statistics for this collection. 122 * 123 * @return the statistics object, must not be <code>null</code>. 124 * @throws CollectionException 125 * thrown when the collection fails to return items. 126 * @throws InterruptedException 127 * when interrupted. 128 */ 129 Statistics getStatistics() throws CollectionException, InterruptedException; 130 131 /*** 132 * Returns ID returned by this collection in the {@link CategoryItem#id} as 133 * String. This item will only be used to perform searches - you should thus 134 * preserve minimum information from the category item. This functionality 135 * is only used by {@link AmpacheServer}. You do not need to store the 136 * {@link CategoryItem#category} - it will be overwritten. 137 * 138 * @param item 139 * the item to convert 140 * @return string representation of given item. 141 */ 142 String serializeItem(final CategoryItem item); 143 144 /*** 145 * Deserializes item serialized by {@link #serializeItem(CategoryItem)}. 146 * This item will be used to perform search only. This functionality is only 147 * used by {@link AmpacheServer}. You do not need to store the 148 * {@link CategoryItem#category} - it will be overwritten. 149 * 150 * @param serializedItem 151 * the item to deserialize 152 * @return the ID instance. 153 */ 154 CategoryItem deserializeItem(final String serializedItem); 155 156 /*** 157 * Returns a new instance of the track provider. May return 158 * <code>null</code> if this collection does not provide this functionality. 159 * It is caller's responsibility to close the provider. 160 * 161 * @param random 162 * initially provide tracks using this random value. 163 * @return new provider instance, may be <code>null</code>. 164 */ 165 IDynamicPlaylistTrackProvider newTrackProvider(final Random random); 166 167 /*** 168 * Search for tracks using given criteria search. 169 * 170 * @param criteria 171 * the criteria, must not be <code>null</code>. AND operator is 172 * used if multiple criteria are specified. String values are 173 * matched as substrings. 174 * @return tracks that comply given criteria, in no particular order. 175 * @throws CollectionException 176 * thrown when the collection fails to return items. 177 * @throws InterruptedException 178 * when interrupted. 179 */ 180 List<TrackMetadataBean> findTracks(final Map<CategoryEnum, String> criteria) 181 throws CollectionException, InterruptedException; 182 183 /*** 184 * Serves for optimalization purposes only: checks if this collection can 185 * perform {@link #fixLocations(Collection) obsolete locations fixup} or 186 * not. 187 * 188 * @return <code>true</code> if {@link #fixLocations(Collection)} is 189 * supported, <code>false</code> if the collection cannot fix the 190 * locations, or the fix operation is not applicable to this 191 * collection. 192 */ 193 boolean supportsLocationFix(); 194 195 /*** 196 * <p> 197 * Given locations became invalid and need fixing. 198 * </p> 199 * <p> 200 * {@link MediaPlayer} detected an error while playing first location URL 201 * from given location list. All given locations might thus have become 202 * invalid. The collection is asked to fix these locations: it should 203 * re-connect to the server (if any) and/or perform any required steps. If 204 * any of these locations became completely invalid the method is free to 205 * omit them in the result map. If the collection is unable to fix given 206 * location then just pass input location. 207 * </p> 208 * <p> 209 * Invoked asynchronously. This method will receive only locations provided 210 * earlier by {@link TrackMetadataBean track} lookup methods such as 211 * {@link #findTracks(Map)}. 212 * </p> 213 * 214 * @param locations 215 * the list of (possibly) invalid locations. Never 216 * <code>null</code> nor empty. 217 * @return a map of locations, maps original location to a fixed locations. 218 * Must not be <code>null</code>. 219 * @throws CollectionException 220 * thrown when this collection is unable to fix the locations. 221 * @throws InterruptedException 222 * thrown when interrupted. 223 */ 224 Map<String, String> fixLocations(final Collection<String> locations) 225 throws CollectionException, InterruptedException; 226 }