1/*
2 * Copyright (C) 2013 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.camera.data;
18
19import android.net.Uri;
20
21import com.android.camera.util.Size;
22
23import java.util.Date;
24
25/**
26 * Represents an immutable set of backing data. No object or value
27 * returned from this object should be mutable.
28 */
29public class FilmstripItemData {
30    // TODO Make these enum values.
31    public static final String MIME_TYPE_JPEG = "image/jpeg";
32    public static final String MIME_TYPE_GIF = "image/gif";
33    public static final String MIME_TYPE_PHOTOSPHERE = "application/vnd.google.panorama360+jpg";
34    public static final String MIME_TYPE_MP4 = "video/mp4";
35
36    private final long mContentId;
37    private final String mTitle;
38    private final String mMimeType;
39    private final Date mCreationDate;
40    private final Date mLastModifiedDate;
41    private final String mFilePath;
42    private final Uri mUri;
43    private final Size mDimensions;
44    private final long mSizeInBytes;
45    private final int mOrientation;
46    private final Location mLocation;
47
48    public FilmstripItemData(
49          long contentId,
50          String title,
51          String mimeType,
52          Date creationDate,
53          Date lastModifiedDate,
54          String filePath,
55          Uri uri,
56          Size dimensions,
57          long sizeInBytes,
58          int orientation,
59          Location location) {
60        mContentId = contentId;
61        mTitle = title;
62        mMimeType = mimeType;
63        mCreationDate = creationDate;
64        mLastModifiedDate = lastModifiedDate;
65        mFilePath = filePath;
66        mUri = uri;
67        mDimensions = dimensions;
68        mSizeInBytes = sizeInBytes;
69        mOrientation = orientation;
70        mLocation = location;
71    }
72
73    public long getContentId() {
74        return mContentId;
75    }
76
77    /**
78     * Gets the string title of this item. May be used for sorting.
79     */
80    public String getTitle() {
81        return mTitle;
82    }
83
84    /**
85     * @return The mimetype of this data item, or null, if this item has no
86     *         mimetype associated with it.
87     */
88    public String getMimeType() {
89        return mMimeType;
90    }
91
92    /**
93     * Gets the date when this item was created. The returned date may be used
94     * for sorting.
95     */
96    public Date getCreationDate() {
97        return mCreationDate;
98    }
99
100    /**
101     * Gets the date when this item was last modified. The returned date may
102     * be used for sorting.
103     */
104    public Date getLastModifiedDate() {
105        return mLastModifiedDate;
106    }
107
108    /**
109     * Returns the path to the data on the storage.
110     */
111    public String getFilePath() {
112        return mFilePath;
113    }
114
115    /**
116     * @return The URI of this data. Must be a unique one and not null.
117     */
118    public Uri getUri() {
119        return mUri;
120    }
121
122    /**
123     * Dimensions of this item.
124     *
125     * @return physical width and height in pixels.
126     */
127    /* package */ Size getDimensions() {
128        return mDimensions;
129    }
130
131    /**
132     * @return total number of bytes that represent this item.
133     */
134    public long getSizeInBytes() {
135        return mSizeInBytes;
136    }
137
138    /**
139     * Returns the rotation of the image in degrees clockwise. The valid values
140     * are 0, 90, 180, and 270.
141     */
142    /* package */ int getOrientation() {
143        return mOrientation;
144    }
145
146    public Location getLocation() {
147        return mLocation;
148    }
149
150    @Override
151    public String toString() {
152        StringBuilder sb = new StringBuilder();
153        sb.append("FilmstripItemData {");
154        sb.append("id:");
155        sb.append(mContentId);
156        sb.append(",title:");
157        sb.append(mTitle);
158        sb.append(",mimeType:");
159        sb.append(mMimeType);
160        sb.append(",creationDate:");
161        sb.append(mCreationDate);
162        sb.append(",lastModifiedDate:");
163        sb.append(mLastModifiedDate);
164        sb.append(",filePath:");
165        sb.append(mFilePath);
166        sb.append(",uri:");
167        sb.append(mUri);
168        sb.append(",dimensions:");
169        sb.append(mDimensions);
170        sb.append(",sizeInBytes:");
171        sb.append(mSizeInBytes);
172        sb.append(",orientation:");
173        sb.append(mOrientation);
174        sb.append(",location:");
175        sb.append(mLocation);
176        sb.append("}");
177        return sb.toString();
178    }
179
180    public static class Builder {
181        public static final Date EMPTY = new Date(0);
182        public static final Size ZERO = new Size(0, 0);
183
184        private long mContentId = -1;
185        private String mTitle = "";
186        private String mMimeType = "";
187        private Date mCreationDate = EMPTY;
188        private Date mLastModifiedDate = EMPTY;
189        private String mFilePath = "";
190        private final Uri mUri;
191        private Size mDimensions = ZERO;
192        private long mSizeInBytes = 0;
193        private int mOrientation = 0;
194        private Location mLocation = Location.UNKNOWN;
195
196        public Builder(Uri uri) {
197            mUri = uri;
198        }
199
200        public FilmstripItemData build() {
201            return new FilmstripItemData(
202                  mContentId,
203                  mTitle,
204                  mMimeType,
205                  mCreationDate,
206                  mLastModifiedDate,
207                  mFilePath,
208                  mUri,
209                  mDimensions,
210                  mSizeInBytes,
211                  mOrientation,
212                  mLocation
213            );
214        }
215
216        public static Builder from(FilmstripItemData data) {
217            Builder builder = new Builder(data.getUri());
218            builder.mContentId = data.getContentId();
219            builder.mTitle = data.getTitle();
220            builder.mMimeType = data.getMimeType();
221            builder.mCreationDate = data.getCreationDate();
222            builder.mLastModifiedDate = data.getLastModifiedDate();
223            builder.mFilePath = data.getFilePath();
224            builder.mDimensions = data.getDimensions();
225            builder.mSizeInBytes = data.getSizeInBytes();
226            builder.mOrientation = data.getOrientation();
227            builder.mLocation = data.getLocation();
228            return builder;
229        }
230
231        public Builder withContentId(long contentId) {
232            mContentId = contentId;
233            return this;
234        }
235
236        public Builder withTitle(String title) {
237            mTitle = title;
238            return this;
239        }
240
241        public Builder withMimeType(String mimeType) {
242            mMimeType = mimeType;
243            return this;
244        }
245
246        public Builder withCreationDate(Date creationDate) {
247            mCreationDate = creationDate;
248            return this;
249        }
250
251        public Builder withLastModifiedDate(Date lastModifiedDate) {
252            mLastModifiedDate = lastModifiedDate;
253            return this;
254        }
255
256        public Builder withFilePath(String filePath) {
257            mFilePath = filePath;
258            return this;
259        }
260
261        public Builder withDimensions(Size dimensions) {
262            mDimensions = dimensions;
263            return this;
264        }
265
266        public Builder withSizeInBytes(long sizeInBytes) {
267            mSizeInBytes = sizeInBytes;
268            return this;
269        }
270
271        public Builder withOrientation(int orientation) {
272            mOrientation = orientation;
273            return this;
274        }
275
276        public Builder withLocation(Location location) {
277            mLocation = location;
278            return this;
279        }
280    }
281}
282