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.io.Serializable;
22
23 import sk.baka.ambient.commons.MiscUtils;
24
25 /***
26 * A single category, may be an artist, an album or a genre.
27 *
28 * @author Martin Vysny
29 */
30 public final class CategoryItem implements Serializable {
31 private static final long serialVersionUID = -6381439171709962868L;
32 /***
33 * The collection-strategy-dependent ID, may be <code>null</code>.
34 */
35 public final Object id;
36 /***
37 * The name of the item, may be <code>null</code> if the name is missing.
38 */
39 public final String name;
40
41 /***
42 * Returns displayable name (the "[empty]" string instead of
43 * <code>null</code>).
44 *
45 * @return the displayable name.
46 */
47 public String getDisplayableName() {
48 if (MiscUtils.isEmptyOrWhitespace(name)) {
49 return "[empty]";
50 }
51 return name;
52 }
53
54 /***
55 * Returns displayable year (the "[empty]" string instead of
56 * <code>null</code>).
57 *
58 * @return the displayable year.
59 */
60 public String getDisplayableYear() {
61 if (MiscUtils.isEmptyOrWhitespace(year)) {
62 return "[empty]";
63 }
64 return year;
65 }
66
67 /***
68 * In case of an album the year may be specified. <code>null</code> if not
69 * known.
70 */
71 public final String year;
72
73 /***
74 * The category of this item, must not be <code>null</code>.
75 */
76 public final CategoryEnum category;
77 /***
78 * Contains a number of albums for given artist or genre. Equals to 1 for
79 * {@link CategoryEnum#Title} and {@link CategoryEnum#Album} categories. May
80 * be -1 if not known.
81 */
82 public final int albums;
83 /***
84 * Contains a number of songs for given artist, genre or album. Equals to 1
85 * for {@link CategoryEnum#Title}. May be -1 if not known.
86 */
87 public final int songs;
88
89 /***
90 * Creates new category item instance.
91 *
92 * @param id
93 * the collection-strategy-dependent ID, may be <code>null</code>
94 *
95 * @param name
96 * the name of the item.
97 * @param year
98 * in case of an album the year may be specified.
99 * <code>null</code> if not known.
100 * @param category
101 * The category of this item, must not be <code>null</code>.
102 * @param albums
103 * Contains a number of albums for given artist or genre. Equals
104 * to 1 for {@link CategoryEnum#Title} and
105 * {@link CategoryEnum#Album} categories. May be -1 if not known.
106 * @param songs
107 * Contains a number of songs for given artist, genre or album.
108 * Equals to 1 for {@link CategoryEnum#Title}. May be -1 if not
109 * known.
110 */
111 public CategoryItem(final Object id, final String name, final String year,
112 final CategoryEnum category, final int albums, final int songs) {
113 if (category == null) {
114 throw new IllegalArgumentException("category is null");
115 }
116 this.id = id;
117 this.name = name;
118 this.year = year;
119 this.category = category;
120 this.albums = albums;
121 this.songs = songs;
122 }
123
124 /***
125 * Builds the {@link CategoryItem}.
126 *
127 * @author Martin Vysny
128 */
129 public static class Builder {
130 /***
131 * The collection-strategy-dependent ID, may be <code>null</code>.
132 */
133 public Object id;
134 /***
135 * The name of the item, may be <code>null</code> if the name is
136 * missing.
137 */
138 public String name;
139 /***
140 * In case of an album the year may be specified. <code>null</code> if
141 * not known.
142 */
143 public String year;
144
145 /***
146 * The category of this item, must not be <code>null</code>.
147 */
148 public CategoryEnum category;
149
150 /***
151 * Contains a number of albums for given artist or genre. Equals to 1
152 * for {@link CategoryEnum#Title} and {@link CategoryEnum#Album}
153 * categories. May be -1 if not known.
154 */
155 public int albums = -1;
156 /***
157 * Contains a number of songs for given artist, genre or album. Equals
158 * to 1 for {@link CategoryEnum#Title}. May be -1 if not known.
159 */
160 public int songs = -1;
161
162 /***
163 * Builds new category item.
164 *
165 * @return the category item instance.
166 */
167 public CategoryItem build() {
168 return new CategoryItem(id, name, year, category, albums, songs);
169 }
170
171 /***
172 * Sets id.
173 *
174 * @param id
175 * The collection-strategy-dependent ID, may be
176 * <code>null</code>.
177 * @return this
178 */
179 public Builder setId(final Object id) {
180 this.id = id;
181 return this;
182 }
183
184 /***
185 * Sets name.
186 *
187 * @param name
188 * The name of the item.
189 * @return this
190 */
191 public Builder setName(final String name) {
192 this.name = name;
193 return this;
194 }
195
196 /***
197 * Sets year.
198 *
199 * @param year
200 * In case of an album the year may be specified.
201 * <code>null</code> if not known.
202 * @return this
203 */
204 public Builder setYear(final String year) {
205 this.year = year;
206 return this;
207 }
208
209 /***
210 * Sets the category.
211 *
212 * @param category
213 * The category of this item, must not be <code>null</code>.
214 * @return this
215 */
216 public Builder setCategory(final CategoryEnum category) {
217 this.category = category;
218 return this;
219 }
220
221 /***
222 * Contains a number of albums for given artist or genre. Equals to 1
223 * for {@link CategoryEnum#Title} and {@link CategoryEnum#Album}
224 * categories. May be -1 if not known.
225 *
226 * @param albums
227 * The number of albums for this item.
228 * @return this
229 */
230 public Builder setAlbums(int albums) {
231 this.albums = albums;
232 return this;
233 }
234
235 /***
236 * Contains a number of songs for given artist, genre or album. Equals
237 * to 1 for {@link CategoryEnum#Title}. May be -1 if not known.
238 *
239 * @param songs
240 * The number of songs for this item.
241 * @return this
242 */
243 public Builder setSongs(int songs) {
244 this.songs = songs;
245 return this;
246 }
247
248 /***
249 * Fills this builder with data from given item.
250 *
251 * @param item
252 * the item to read
253 * @return this
254 */
255 public Builder getData(CategoryItem item) {
256 id = item.id;
257 albums = item.albums;
258 category = item.category;
259 name = item.name;
260 songs = item.songs;
261 year = item.year;
262 return this;
263 }
264 }
265
266 @Override
267 public String toString() {
268 return id + ": " + name + (year == null ? "" : " (" + year + ")");
269 }
270
271 @Override
272 public boolean equals(Object o) {
273 if (o == this) {
274 return true;
275 }
276 if (!(o instanceof CategoryItem)) {
277 return false;
278 }
279 final CategoryItem other = (CategoryItem) o;
280 return (category == other.category)
281 && MiscUtils.nullEquals(year, other.year)
282 && MiscUtils.nullEquals(name, other.name);
283 }
284
285 @Override
286 public int hashCode() {
287 int i = category.hashCode();
288 i = i * 1001 + MiscUtils.hashCode(year);
289 i = i * 1001 + MiscUtils.hashCode(name);
290 return i;
291 }
292 }