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
17package com.android.videoeditor.service;
18
19import java.util.Map;
20
21import android.media.videoeditor.Overlay;
22import android.os.Bundle;
23
24
25/**
26 * The representation of an overlay in the user interface
27 */
28public class MovieOverlay {
29    // Overlay types
30    public static final int OVERLAY_TYPE_CENTER_1 = 0;
31    public static final int OVERLAY_TYPE_BOTTOM_1 = 1;
32    public static final int OVERLAY_TYPE_CENTER_2 = 2;
33    public static final int OVERLAY_TYPE_BOTTOM_2 = 3;
34
35    // User attribute keys
36    private static final String KEY_TYPE = "type";
37    private static final String KEY_TITLE = "title";
38    private static final String KEY_SUBTITLE = "subtitle";
39
40    // Instance variables
41    private final String mUniqueId;
42    private long mStartTimeMs;
43    private long mDurationMs;
44    private String mTitle;
45    private String mSubtitle;
46    private int mType;
47
48    private long mAppStartTimeMs;
49    private long mAppDurationMs;
50
51    /**
52     * Default constructor
53     */
54    @SuppressWarnings("unused")
55    private MovieOverlay() {
56        this(null);
57    }
58
59    /**
60     * Constructor
61     *
62     * @param overlay The overlay
63     */
64    MovieOverlay(Overlay overlay) {
65        mUniqueId = overlay.getId();
66        mAppStartTimeMs = mStartTimeMs = overlay.getStartTime();
67        mAppDurationMs = mDurationMs = overlay.getDuration();
68
69        final Map<String, String> userAttributes = overlay.getUserAttributes();
70        mTitle = userAttributes.get(KEY_TITLE);
71        mSubtitle = userAttributes.get(KEY_SUBTITLE);
72        mType = Integer.parseInt(userAttributes.get(KEY_TYPE));
73    }
74
75    /**
76     * Constructor
77     *
78     * @param id The overlay id
79     * @param startTimeMs The start time
80     * @param durationMs The duration
81     * @param title The title
82     * @param subTitle The sub title
83     * @param type The title type
84     */
85    MovieOverlay(String id, long startTimeMs, long durationMs, String title,
86            String subTitle, int type) {
87        mUniqueId = id;
88        mAppStartTimeMs = mStartTimeMs = startTimeMs;
89        mAppDurationMs = mDurationMs = durationMs;
90
91        mTitle = title;
92        mSubtitle = subTitle;
93        mType = type;
94    }
95
96    /**
97     * @return The id of this overlay
98     */
99    public String getId() {
100        return mUniqueId;
101    }
102
103    /**
104     * If a preview or export is in progress, then this change is effective for
105     * next preview or export session.
106     *
107     * @param durationMs The duration in milliseconds
108     */
109    void setDuration(long durationMs) {
110        mDurationMs = durationMs;
111    }
112
113    /**
114     * @return The duration of the overlay effect
115     */
116    long getDuration() {
117        return mDurationMs;
118    }
119
120    /**
121     * If a preview or export is in progress, then this change is effective for
122     * next preview or export session.
123     *
124     * @param durationMs The duration in milliseconds
125     */
126    public void setAppDuration(long durationMs) {
127        mAppDurationMs = durationMs;
128    }
129
130    /**
131     * @return The duration of the overlay effect
132     */
133    public long getAppDuration() {
134        return mAppDurationMs;
135    }
136
137    /**
138     * Set the start time for the overlay. If a preview or export is in
139     * progress, then this change is effective for next preview or export
140     * session.
141     *
142     * @param startTimeMs start time in milliseconds
143     */
144    void setStartTime(long startTimeMs) {
145        mStartTimeMs = startTimeMs;
146    }
147
148    /**
149     * @return the start time of the overlay
150     */
151    long getStartTime() {
152        return mStartTimeMs;
153    }
154
155    /**
156     * Set the start time of this audio track relative to the storyboard
157     * timeline. Default value is 0.
158     *
159     * @param startTimeMs the start time in milliseconds
160     */
161    public void setAppStartTime(long startTimeMs) {
162        mAppStartTimeMs = startTimeMs;
163    }
164
165    /**
166     * Get the start time of this audio track relative to the storyboard
167     * timeline.
168     *
169     * @return The start time in milliseconds
170     */
171    public long getAppStartTime() {
172        return mAppStartTimeMs;
173    }
174
175    /**
176     * @return The title
177     */
178    public String getTitle() {
179        return mTitle;
180    }
181
182    /**
183     * @return The subtitle
184     */
185    public String getSubtitle() {
186        return mSubtitle;
187    }
188
189    /**
190     * @return The type
191     */
192    public int getType() {
193        return mType;
194    }
195
196    /*
197     * {@inheritDoc}
198     */
199    @Override
200    public boolean equals(Object object) {
201        if (!(object instanceof MovieOverlay)) {
202            return false;
203        }
204        return mUniqueId.equals(((MovieOverlay)object).mUniqueId);
205    }
206
207    /*
208     * {@inheritDoc}
209     */
210    @Override
211    public int hashCode() {
212        return mUniqueId.hashCode();
213    }
214
215    /**
216     * Build the user attributes
217     *
218     * @return The user attributes
219     */
220    public Bundle buildUserAttributes() {
221        final Bundle userAttributes = new Bundle(4);
222        userAttributes.putInt(KEY_TYPE, mType);
223        userAttributes.putString(KEY_TITLE, mTitle);
224        userAttributes.putString(KEY_SUBTITLE, mSubtitle);
225        return userAttributes;
226    }
227
228    /**
229     * Build the user attributes
230     *
231     * @param type The overlay type
232     * @param title The overlay title
233     * @param subtitle The overlay subtitle
234     *
235     * @return The user attributes
236     */
237    public static Bundle buildUserAttributes(int type, String title, String subtitle) {
238        final Bundle userAttributes = new Bundle(4);
239        userAttributes.putInt(KEY_TYPE, type);
240        userAttributes.putString(KEY_TITLE, title);
241        userAttributes.putString(KEY_SUBTITLE, subtitle);
242        return userAttributes;
243    }
244
245    /**
246     * @param userAttributes The user attributes
247     */
248    void updateUserAttributes(Bundle userAttributes) {
249        mType = userAttributes.getInt(KEY_TYPE);
250        mTitle = userAttributes.getString(KEY_TITLE);
251        mSubtitle = userAttributes.getString(KEY_SUBTITLE);
252    }
253
254    /**
255     * Get the type of the value corresponding to the specified key
256     *
257     * @param name The key name
258     *
259     * @return The type
260     */
261    public static Class<?> getAttributeType(String name) {
262        if (KEY_TYPE.equals(name)) {
263            return Integer.class;
264        } else {
265            return String.class;
266        }
267    }
268
269    /**
270     * @param userAttributes The user attributes
271     *
272     * @return The type
273     */
274    public static int getType(Bundle userAttributes) {
275        return userAttributes.getInt(KEY_TYPE);
276    }
277
278    /**
279     * @param userAttributes The user attributes
280     *
281     * @return The title
282     */
283    public static String getTitle(Bundle userAttributes) {
284        return userAttributes.getString(KEY_TITLE);
285    }
286
287    /**
288     * @param userAttributes The user attributes
289     *
290     * @return The subtitle
291     */
292    public static String getSubtitle(Bundle userAttributes) {
293        return userAttributes.getString(KEY_SUBTITLE);
294    }
295}
296