1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/*
2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2010 The Android Open Source Project
3ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
4ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License");
5ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * you may not use this file except in compliance with the License.
6ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * You may obtain a copy of the License at
7ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
8ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *      http://www.apache.org/licenses/LICENSE-2.0
9ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi *
10ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Unless required by applicable law or agreed to in writing, software
11ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS,
12ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * See the License for the specific language governing permissions and
14ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * limitations under the License.
15ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
16ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschipackage com.android.videoeditor.service;
18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.File;
20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.FileNotFoundException;
21f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschiimport java.io.FileOutputStream;
22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.io.IOException;
23f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschiimport java.io.InputStream;
24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.ArrayList;
25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.Collections;
26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.Comparator;
27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.HashMap;
28d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Chengimport java.util.Iterator;
29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.List;
30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.Map;
31d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Chengimport java.util.concurrent.BlockingQueue;
32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.concurrent.LinkedBlockingQueue;
33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.Service;
35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.ContentValues;
36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context;
37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Intent;
38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.database.Cursor;
39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Bitmap;
40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Rect;
41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.AudioTrack;
42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.Effect;
43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.EffectColor;
44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.EffectKenBurns;
45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.ExtractAudioWaveformProgressListener;
46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaImageItem;
47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaItem;
48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaProperties;
49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaVideoItem;
50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.Overlay;
51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.OverlayFrame;
52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.Transition;
53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.TransitionAlpha;
54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.TransitionCrossfade;
55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.TransitionFadeBlack;
56ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.TransitionSliding;
57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.VideoEditor;
58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.VideoEditorFactory;
59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.WaveformData;
60f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Changimport android.media.videoeditor.MediaItem.GetThumbnailListCallback;
61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.VideoEditor.ExportProgressListener;
62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.VideoEditor.MediaProcessingProgressListener;
63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.net.Uri;
64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Bundle;
65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Handler;
66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.IBinder;
67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Looper;
68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.provider.MediaStore;
69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.provider.MediaStore.Audio;
70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.provider.MediaStore.Images;
71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.provider.MediaStore.Video;
72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Log;
73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
7481393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.R;
7581393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.FileUtils;
7681393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.ImageUtils;
7781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.MediaItemUtils;
7881393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.StringUtils;
79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/**
81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * VideoEditor service API
82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class ApiService extends Service {
84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Logging
85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String TAG = "VEApiService";
86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Additional updates
88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static final int ACTION_UPDATE_FRAME = MediaProcessingProgressListener.ACTION_DECODE + 100;
89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static final int ACTION_NO_FRAME_UPDATE = MediaProcessingProgressListener.ACTION_DECODE + 101;
90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Parameters
92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_OP = "op";
93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_REQUEST_ID = "rid";
94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_PROJECT_PATH = "project";
95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_FILENAME = "filename";
96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_STORYBOARD_ITEM_ID = "item_id";
97ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_RELATIVE_STORYBOARD_ITEM_ID = "r_item_id";
98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_PROGRESS_VALUE = "prog_value";
99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_EXCEPTION = "ex";
100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_START_TIME = "s_time";
101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_END_TIME = "e_time";
102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_DURATION = "duration";
103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_WIDTH = "width";
104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_HEIGHT = "height";
105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_BITRATE = "bitrate";
106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MEDIA_ITEM_RENDERING_MODE = "rm";
107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MEDIA_ITEM_START_RECT = "start_rect";
108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MEDIA_ITEM_END_RECT = "end_rect";
109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_EFFECT_TYPE = "e_type";
110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_EFFECT_PARAM = "e_param";
111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_TRANSITION_BEHAVIOR = "behavior";
112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_TRANSITION_MASK = "t_mask";
113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_TRANSITION_BLENDING = "t_blending";
114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_TRANSITION_INVERT = "t_invert";
115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_TRANSITION_DIRECTION = "t_dir";
116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_INTENT = "req_intent";
117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_PROJECT_NAME = "name";
118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MOVIES_FILENAMES = "movies";
119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_PHOTOS_FILENAMES = "images";
120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_ASPECT_RATIO = "aspect_ratio";
121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_BEGIN_BOUNDARY = "b_boundary";
122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_END_BOUNDARY = "e_boundary";
123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_ATTRIBUTES = "attributes";
124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_VOLUME = "volume";
125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_LOOP = "loop";
126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MUTE = "mute";
127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_DUCK = "duck";
128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_MOVIE_URI = "uri";
129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_THEME = "theme";
130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_ACTION = "action";
131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_COUNT = "count";
132f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang    private static final String PARAM_TOKEN = "token";
133f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang    private static final String PARAM_INDICES = "indices";
134378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang    private static final String PARAM_CANCELLED = "cancelled";
135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Operations
137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_CREATE = 1;
138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_LOAD = 2;
139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_SAVE = 3;
140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_EXPORT = 4;
141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_CANCEL_EXPORT = 5;
142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_EXPORT_STATUS = 6;
143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_RELEASE = 8;
144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_DELETE = 9;
145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_SET_ASPECT_RATIO = 10;
146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_APPLY_THEME = 11;
147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_GENERATE_PREVIEW_PROGRESS = 12;
148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_VIDEO_EDITOR_LOAD_PROJECTS = 13;
149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_ADD_VIDEO_URI = 100;
151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_ADD_IMAGE_URI = 101;
152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_MOVE = 102;
153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_REMOVE = 103;
154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_SET_RENDERING_MODE = 104;
155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_SET_DURATION = 105;
156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_SET_BOUNDARIES = 106;
157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_SET_VOLUME = 107;
158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_SET_MUTE = 108;
159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM = 109;
160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM_STATUS = 110;
161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_MEDIA_ITEM_GET_THUMBNAILS = 112;
162f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi    private static final int OP_MEDIA_ITEM_LOAD = 113;
163f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi    private static final int OP_MEDIA_ITEM_LOAD_STATUS = 114;
164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_EFFECT_ADD_COLOR = 200;
166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_EFFECT_ADD_IMAGE_KEN_BURNS = 201;
167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_EFFECT_REMOVE = 202;
168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_INSERT_ALPHA = 300;
170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_INSERT_CROSSFADE = 301;
171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_INSERT_FADE_BLACK = 302;
172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_INSERT_SLIDING = 303;
173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_REMOVE = 304;
174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_SET_DURATION = 305;
175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_TRANSITION_GET_THUMBNAIL = 306;
176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_OVERLAY_ADD = 400;
178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_OVERLAY_REMOVE = 401;
179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_OVERLAY_SET_START_TIME = 402;
180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_OVERLAY_SET_DURATION = 403;
181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_OVERLAY_SET_ATTRIBUTES = 404;
182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_ADD = 500;
184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_REMOVE = 501;
185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_SET_VOLUME = 502;
186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_SET_MUTE = 503;
187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_SET_BOUNDARIES = 505;
188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_SET_LOOP = 506;
189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_SET_DUCK = 507;
190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM = 508;
191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final int OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM_STATUS = 509;
192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
193516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi    private static final int DUCK_THRESHOLD = 20;
194516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi    private static final int DUCK_TRACK_VOLUME = 65;
195516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi    // The default audio track volume
196516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi    private static final int DEFAULT_AUDIO_TRACK_VOLUME = 50;
197516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi
198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Static member variables
199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final Map<String, Intent> mPendingIntents = new HashMap<String, Intent>();
200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final List<ApiServiceListener> mListeners = new ArrayList<ApiServiceListener>();
201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final IntentPool mIntentPool = new IntentPool(8);
202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static VideoEditorProject mVideoProject;
203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static VideoEditor mVideoEditor;
204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static ServiceMediaProcessingProgressListener mGeneratePreviewListener;
2052de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng    private static volatile boolean mExportCancelled;
206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
207d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private IntentProcessor mVideoThread;
208d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private IntentProcessor mAudioThread;
209d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private IntentProcessor mThumbnailThread;
210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private Handler mHandler;
211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final Runnable mStopRunnable = new Runnable() {
213258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng        @Override
214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void run() {
215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mPendingIntents.size() == 0) {
216d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                logd("Stop runnable: Stopping service");
217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                stopSelf();
218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    };
221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Generate preview listener
224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
225ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final class ServiceMediaProcessingProgressListener
226ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            implements VideoEditor.MediaProcessingProgressListener {
227ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Instance variables
228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        private final String mProjectPath;
229ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * Constructor
232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * @param projectPath The project path
234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public ServiceMediaProcessingProgressListener(String projectPath) {
236ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mProjectPath = projectPath;
237ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
238ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
239258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng        @Override
240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onProgress(Object item, int action, int progress) {
241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final Intent intent = mIntentPool.get();
242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_GENERATE_PREVIEW_PROGRESS);
243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            intent.putExtra(PARAM_PROJECT_PATH, mProjectPath);
244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            intent.putExtra(PARAM_ACTION, action);
245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            intent.putExtra(PARAM_PROGRESS_VALUE, progress);
246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (item == null) { // Last callback uses null
248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else if (item instanceof MediaItem) {
249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_STORYBOARD_ITEM_ID, ((MediaItem)item).getId());
250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_ATTRIBUTES, MediaItem.class.getCanonicalName());
251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else if (item instanceof Transition) {
252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_STORYBOARD_ITEM_ID, ((Transition)item).getId());
253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_ATTRIBUTES, Transition.class.getCanonicalName());
254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else if (item instanceof AudioTrack) {
255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_STORYBOARD_ITEM_ID, ((AudioTrack)item).getId());
256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                intent.putExtra(PARAM_ATTRIBUTES, AudioTrack.class.getCanonicalName());
257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                Log.w(TAG, "Unsupported storyboard item type: " + item.getClass());
259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return;
260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            completeRequest(intent, null, null, null, null, true);
263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return A unique id
268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static String generateId() {
270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return StringUtils.randomString(6);
271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Register a listener
275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param listener The listener
277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void registerListener(ApiServiceListener listener) {
279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mListeners.add(listener);
280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Unregister a listener
284ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
285ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param listener The listener
286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void unregisterListener(ApiServiceListener listener) {
288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mListeners.remove(listener);
289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Load the projects
293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void loadProjects(Context context) {
297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_LOAD_PROJECTS);
299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Create a new VideoEditor project
305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
306ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectName The project name
309ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param movies The array of movie file names to add to the newly
310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *      created project
311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param photos The array of photo file names to add to the newly
312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *      created project
313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeType The theme type
314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void createVideoEditor(Context context, String projectPath, String projectName,
316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                String[] movies, String[] photos, String themeType) {
317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_CREATE);
319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_NAME, projectName);
321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MOVIES_FILENAMES, movies);
322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PHOTOS_FILENAMES, photos);
323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_THEME, themeType);
324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Create a new VideoEditor project
330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void loadVideoEditor(Context context, String projectPath) {
335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_LOAD);
337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Export the VideoEditor movie
344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param filename The export filename
348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param height The output movie height
349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param bitrate The output movie bitrate
350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void exportVideoEditor(Context context, String projectPath, String filename,
352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int height, int bitrate) {
353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_EXPORT);
355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_FILENAME, filename);
357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_HEIGHT, height);
358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_BITRATE, bitrate);
359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Check if export is pending
365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param filename The export filename
368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return true if the export is pending
370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static boolean isVideoEditorExportPending(String projectPath, String filename) {
372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (Intent intent : mPendingIntents.values()) {
373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int op = intent.getIntExtra(PARAM_OP, -1);
374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (op == OP_VIDEO_EDITOR_EXPORT) {
375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                String pp = intent.getStringExtra(PARAM_PROJECT_PATH);
376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (pp.equals(projectPath)) {
377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String fn = intent.getStringExtra(PARAM_FILENAME);
378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (fn.equals(filename)) {
379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return true;
380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return false;
386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
389ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Cancel the export of the specified VideoEditor movie
390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param filename The export filename
394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void cancelExportVideoEditor(Context context, String projectPath,
396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String filename) {
3972de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng        mExportCancelled = true;
398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_CANCEL_EXPORT);
400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_FILENAME, filename);
402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Change the aspect ratio
408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param aspectRatio The aspect ratio
412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAspectRatio(Context context, String projectPath, int aspectRatio) {
414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_SET_ASPECT_RATIO);
416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_ASPECT_RATIO, aspectRatio);
418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Apply a theme
424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param theme The theme
428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     public static void applyTheme(Context context, String projectPath, String theme) {
430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         final Intent intent = mIntentPool.get(context, ApiService.class);
431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_APPLY_THEME);
432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         intent.putExtra(PARAM_PROJECT_PATH, projectPath);
433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         intent.putExtra(PARAM_THEME, theme);
434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         startCommand(context, intent);
436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     }
437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
439fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng     * Checks if the service is busy modifying the timeline. While
440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * the video editor is busy the application should not attempt
441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * to preview the movie.
442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
445fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng     * @return {@code true} if the video editor is modifying the timeline
446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
447fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng    public static boolean isProjectBeingEdited(String projectPath) {
448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (Intent intent : mPendingIntents.values()) {
449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int op = intent.getIntExtra(PARAM_OP, -1);
450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            switch (op) {
451fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng                // When these operations are pending the video editor is not busy.
452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_LOAD_PROJECTS:
453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_SAVE:
454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_VOLUME:
455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_MUTE:
456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_GET_THUMBNAILS:
457f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                case OP_MEDIA_ITEM_LOAD:
458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_GET_THUMBNAIL:
459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_VOLUME:
46089489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                case OP_AUDIO_TRACK_SET_MUTE: {
461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
464ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                default: {
465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String pp = intent.getStringExtra(PARAM_PROJECT_PATH);
466d84061f4469829993b278e075c6d2adb7afd9257Gil Dobjanschi                    if (pp != null && pp.equals(projectPath)) {
467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return true;
468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
474ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return false;
475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
47605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
478ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Save the VideoEditor project
479ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
480ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void saveVideoEditor(Context context, String projectPath) {
484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_SAVE);
486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Release the VideoEditor project
493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void releaseVideoEditor(Context context, String projectPath) {
498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_RELEASE);
500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Delete the project specified by the project path
507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void deleteProject(Context context, String projectPath) {
512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_DELETE);
514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add a new video media item after the specified media item id
521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The mediaItem id
525ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId The id of the media item preceding the media item
526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param uri The media item URI
527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param renderingMode The rendering mode
528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
529ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
530ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addMediaItemVideoUri(Context context, String projectPath,
531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, String afterMediaItemId, Uri uri, int renderingMode,
532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String themeId) {
533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_ADD_VIDEO_URI);
535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_FILENAME, uri);
539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MEDIA_ITEM_RENDERING_MODE, renderingMode);
540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_THEME, themeId);
541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add a new image media item after the specified media item id
547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The mediaItem id
551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId The id of the media item preceding the media item
552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param uri The media item URI
553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param renderingMode The rendering mode
554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration of the item (for images only, ignored for videos)
555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
556ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
557ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addMediaItemImageUri(Context context, String projectPath,
558ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, String afterMediaItemId, Uri uri, int renderingMode,
559ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            long durationMs, String themeId) {
560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_ADD_IMAGE_URI);
562ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
56352e68252e84b2ae3a4382adef8772355506d995cGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
56452e68252e84b2ae3a4382adef8772355506d995cGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_FILENAME, uri);
56652e68252e84b2ae3a4382adef8772355506d995cGil Dobjanschi        intent.putExtra(PARAM_MEDIA_ITEM_RENDERING_MODE, renderingMode);
56752e68252e84b2ae3a4382adef8772355506d995cGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
56852e68252e84b2ae3a4382adef8772355506d995cGil Dobjanschi        intent.putExtra(PARAM_THEME, themeId);
569f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
570f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        startCommand(context, intent);
571f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi    }
572f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
573f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi    /**
574f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     * Download or make a copy of an image from the specified URI
575f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     *
576f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     * @param context The context
577f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     * @param projectPath The project path
578f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     * @param uri The media item URI
579f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     * @param mimeType The MIME type
580f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi     */
581f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi    public static void loadMediaItem(Context context, String projectPath, Uri uri,
582f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            String mimeType) {
583f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
584f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_LOAD);
585f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
586f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        intent.putExtra(PARAM_FILENAME, uri);
587f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi        intent.putExtra(PARAM_ATTRIBUTES, mimeType);
588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Move a media item after the specified media id
594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item to move
598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId The id of the relative media item
599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void moveMediaItem(Context context, String projectPath,
602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, String afterMediaItemId, String themeId) {
603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_MOVE);
605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_THEME, themeId);
609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove a media item
615ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item to remove
619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void removeMediaItem(Context context, String projectPath, String mediaItemId,
622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String themeId) {
623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_REMOVE);
625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_THEME, themeId);
628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the rendering mode for a media item
634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setMediaItemRenderingMode(Context context, String projectPath,
640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, int renderingMode) {
641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_SET_RENDERING_MODE);
643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MEDIA_ITEM_RENDERING_MODE, renderingMode);
646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the thumbnails of the specified size
652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param width The width
657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param height The height
658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startMs The start time in milliseconds
659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endMs The end time in milliseconds
660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param count The number of thumbnails
661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
662f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang    public static void getMediaItemThumbnails(Context context,
663f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang            String projectPath, String mediaItemId, int width, int height,
664f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang            long startMs, long endMs, int count, int token, int[] indices) {
665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_GET_THUMBNAILS);
667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_WIDTH, width);
670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_HEIGHT, height);
671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_START_TIME, startMs);
672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_END_TIME, endMs);
673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_COUNT, count);
674f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang        intent.putExtra(PARAM_TOKEN, token);
675f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang        intent.putExtra(PARAM_INDICES, indices);
676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
678ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the media item duration
682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The media item duration
687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setMediaItemDuration(Context context, String projectPath,
689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, long durationMs) {
690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_SET_DURATION);
692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
696ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the media item boundaries
701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
704ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param beginBoundaryMs The media item begin boundary
706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endBoundaryMs The media item end boundary
707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setMediaItemBoundaries(Context context, String projectPath,
709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, long beginBoundaryMs, long endBoundaryMs) {
710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_SET_BOUNDARIES);
712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_BEGIN_BOUNDARY, beginBoundaryMs);
715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_END_BOUNDARY, endBoundaryMs);
716ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
717ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the media item volume (MediaVideoItem only)
722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param volumePercentage The volume
727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setMediaItemVolume(Context context, String projectPath,
729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, int volumePercentage) {
730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_SET_VOLUME);
732ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
733ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
734ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_VOLUME, volumePercentage);
735ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
736ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
737ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
738ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
739ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Mute/unmute the media item (MediaVideoItem only)
741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
743ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
745ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param muted true to mute the media item
746ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
747ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setMediaItemMute(Context context, String projectPath, String mediaItemId,
748ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            boolean muted) {
749ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
750ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_SET_MUTE);
751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
752ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
753ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MUTE, muted);
754ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
757ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
758ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
759ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Extract the media item audio waveform
760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
762ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The id of the media item
764ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
765ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void extractMediaItemAudioWaveform(Context context, String projectPath,
766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId) {
767ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (isMediaItemAudioWaveformPending(projectPath, mediaItemId)) {
768ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
769ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
770ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
771ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
772ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM);
773ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
774ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItemId);
775ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
776ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
777ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
778ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
779ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
780ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Check if extract audio waveform is pending for the specified MediaItem
781ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
782ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
783ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The MediaItem id
784ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
785ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return true if the extract audio waveform is pending
786ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
787ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static boolean isMediaItemAudioWaveformPending(String projectPath, String mediaItemId) {
788ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (Intent intent : mPendingIntents.values()) {
789ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int op = intent.getIntExtra(PARAM_OP, -1);
790ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (op == OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM) {
791ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                String pp = intent.getStringExtra(PARAM_PROJECT_PATH);
792ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (pp.equals(projectPath)) {
793ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String mid = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
794ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mid.equals(mediaItemId)) {
795ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return true;
796ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
797ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
798ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
800ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
801ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return false;
802ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
803ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
804ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
805ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Insert an alpha transition after the specified media item
806ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
807ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
808ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
809ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId Insert the transition after the media item with this id
810ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The transition id
811ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
812ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param behavior The transition behavior
813ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param maskRawResourceId The mask raw resource id
814ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param blending The transition blending
815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param invert The transition invert
816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
817ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void insertAlphaTransition(Context context, String projectPath,
818ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String afterMediaItemId, String transitionId, long durationMs, int behavior,
819ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int maskRawResourceId, int blending, boolean invert) {
820ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
821ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_INSERT_ALPHA);
822ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
823ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
824ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
825ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
826ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_BEHAVIOR, behavior);
827ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_MASK, maskRawResourceId);
828ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_BLENDING, blending);
829ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_INVERT, invert);
830ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
831ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
832ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
833ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
834ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
835ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Insert an crossfade transition after the specified media item
836ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
837ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
838ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
839ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId Insert the transition after the media item with this id
840ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The transition id
841ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
842ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param behavior The transition behavior
843ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
844ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void insertCrossfadeTransition(Context context, String projectPath,
845ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String afterMediaItemId, String transitionId, long durationMs, int behavior) {
846ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
847ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_INSERT_CROSSFADE);
848ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
849ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
850ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
851ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
852ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_BEHAVIOR, behavior);
853ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
854ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
855ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
856ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
857ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
858ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Insert a fade-to-black transition after the specified media item
859ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
860ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
861ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
862ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId Insert the transition after the media item with this id
863ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The transition id
864ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
865ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param behavior The transition behavior
866ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
867ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void insertFadeBlackTransition(Context context, String projectPath,
868ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String afterMediaItemId, String transitionId, long durationMs, int behavior) {
869ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
870ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_INSERT_FADE_BLACK);
871ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
873ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
874ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
875ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_BEHAVIOR, behavior);
876ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
877ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
878ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
879ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
880ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
881ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Insert a sliding transition after the specified media item
882ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
883ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
884ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
885ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param afterMediaItemId Insert the transition after the media item with this id
886ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The transition id
887ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
888ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param behavior The transition behavior
889ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param direction The slide direction
890ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
891ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void insertSlidingTransition(Context context, String projectPath,
892ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String afterMediaItemId, String transitionId, long durationMs, int behavior,
893ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int direction) {
894ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
895ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_INSERT_SLIDING);
896ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
897ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, afterMediaItemId);
898ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
899ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
900ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_BEHAVIOR, behavior);
901ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_TRANSITION_DIRECTION, direction);
902ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
903ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
904ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
905ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
906ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
907ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove a transition
908ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
909ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
910ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
911ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The id of the transition to remove
912ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
913ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void removeTransition(Context context, String projectPath, String transitionId) {
914ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
915ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_REMOVE);
916ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
917ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
918ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
919ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
920ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
921ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
922ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
923ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set a transition duration
924ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
925ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
926ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
927ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The id of the transition
928ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The transition duration
929ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
930ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setTransitionDuration(Context context, String projectPath,
931ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String transitionId, long durationMs) {
932ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
933ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_SET_DURATION);
934ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
935ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
936ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
937ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
938ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
939ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
940ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
941ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
942ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the thumbnail of the specified height
943ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
944ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
945ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
946ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The id of the transition
947ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param height The height
948ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
949ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void getTransitionThumbnails(Context context, String projectPath,
950ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String transitionId, int height) {
951ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
952ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_TRANSITION_GET_THUMBNAIL);
953ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
954ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, transitionId);
955ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_HEIGHT, height);
956ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
957ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
958ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
959ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
960ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
961ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Check if the transition thumbnailing is in progress
962ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
963ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
964ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param transitionId The id of the transition
965ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
966ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return true if the transition thumbnailing is in progress
967ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
968ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static boolean isTransitionThumbnailsPending(String projectPath, String transitionId) {
969ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (Intent intent : mPendingIntents.values()) {
970ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int op = intent.getIntExtra(PARAM_OP, -1);
971ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (op == OP_TRANSITION_GET_THUMBNAIL) {
972ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                String pp = intent.getStringExtra(PARAM_PROJECT_PATH);
973ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (pp.equals(projectPath)) {
974ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String mid = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
975ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mid.equals(transitionId)) {
976ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return true;
977ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
978ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
979ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
980ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
981ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
982ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return false;
983ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
984ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
985ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
986ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add a color effect
987ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
988ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
989ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
990ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
991ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param effectId The effect id
992ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startTimeMs The start time in milliseconds
993ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
994ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param type The effect type
995ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param param The effect param (if any)
996ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addEffectColor(Context context, String projectPath, String mediaItemId,
998ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String effectId, long startTimeMs, long durationMs, int type, int param) {
999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_EFFECT_ADD_COLOR);
1001ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, effectId);
1004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_START_TIME, startTimeMs);
1005ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
1006ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_EFFECT_TYPE, type);
1007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_EFFECT_PARAM, param);
1008ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1012ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1013ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add a Ken Burns effect
1014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1015ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1016ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param effectId The effect id
1019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startTimeMs The start time
1020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration of the item
1021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startRect The start rectangle for the Ken Burns effect
1022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endRect The end rectangle for the Ken Burns effect
1023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1024ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addEffectKenBurns(Context context, String projectPath,
1025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, String effectId, long startTimeMs, long durationMs,
1026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Rect startRect, Rect endRect) {
1027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_EFFECT_ADD_IMAGE_KEN_BURNS);
1029ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1030ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1031ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, effectId);
1032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_START_TIME, startTimeMs);
1033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
1034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MEDIA_ITEM_START_RECT, startRect);
1035ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MEDIA_ITEM_END_RECT, endRect);
1036ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1039ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove an effect
1042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1043ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param effectId The id of the effect to remove
1047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void removeEffect(Context context, String projectPath, String mediaItemId,
1049ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String effectId) {
1050ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1051ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_EFFECT_REMOVE);
1052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, effectId);
1055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1058ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1059ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1060ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add an overlay
1061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param userAttributes The overlay user attributes
1066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startTimeMs The start time in milliseconds
1067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
1068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addOverlay(Context context, String projectPath, String mediaItemId,
1070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String overlayId, Bundle userAttributes, long startTimeMs, long durationMs) {
1071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_OVERLAY_ADD);
1073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1074ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1075ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, overlayId);
1076ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_START_TIME, startTimeMs);
1077ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
1078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_ATTRIBUTES, userAttributes);
1079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1082ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1083ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove an overlay
1085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1086ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1088ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1089ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param overlayId The id of the overlay to remove
1090ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1091ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void removeOverlay(Context context, String projectPath, String mediaItemId,
1092ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String overlayId) {
1093ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1094ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_OVERLAY_REMOVE);
1095ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1096ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1097ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, overlayId);
1098ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1099ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the start time of an overlay
1104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param overlayId The id of the overlay
1109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param startTimeMs The start time in milliseconds
1110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setOverlayStartTime(Context context, String projectPath, String mediaItemId,
1112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String overlayId, long startTimeMs) {
1113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_OVERLAY_SET_START_TIME);
1115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, overlayId);
1118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_START_TIME, startTimeMs);
1119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the duration of an overlay
1125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param overlayId The id of the overlay
1130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param durationMs The duration in milliseconds
1131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setOverlayDuration(Context context, String projectPath, String mediaItemId,
1133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String overlayId, long durationMs) {
1134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_OVERLAY_SET_DURATION);
1136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, overlayId);
1139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DURATION, durationMs);
1140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the user attributes of an overlay
1146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
1150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param overlayId The id of the overlay
1151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param userAttributes The user attributes
1152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setOverlayUserAttributes(Context context, String projectPath,
1154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String mediaItemId, String overlayId, Bundle userAttributes) {
1155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_OVERLAY_SET_ATTRIBUTES);
1157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID, mediaItemId);
1159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, overlayId);
1160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_ATTRIBUTES, userAttributes);
1161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add an audio track
1167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param id The audio track id
1171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param uri The audio track URI
1172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param loop true to loop the audio track
1173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void addAudioTrack(Context context, String projectPath, String id, Uri uri,
1175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            boolean loop) {
1176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_ADD);
1178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, id);
1180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_FILENAME, uri);
1181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_LOOP, loop);
1182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove an audio track from the storyboard timeline
1188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track to remove
1192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void removeAudioTrack(Context context, String projectPath, String audioTrackId) {
1194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_REMOVE);
1196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the audio track boundaries
1204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param beginBoundaryMs The audio track begin boundary
1209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endBoundaryMs The audio track end boundary
1210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAudioTrackBoundaries(Context context, String projectPath,
1212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String audioTrackId, long beginBoundaryMs, long endBoundaryMs) {
1213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_SET_BOUNDARIES);
1215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_BEGIN_BOUNDARY, beginBoundaryMs);
1218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_END_BOUNDARY, endBoundaryMs);
1219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the loop flag for an audio track
1225ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1226ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1227ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1229ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param loop true to loop audio
1230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAudioTrackLoop(Context context, String projectPath, String audioTrackId,
1232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            boolean loop) {
1233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_SET_LOOP);
1235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1236ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1237ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_LOOP, loop);
1238ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the duck flag for an audio track
1244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param duck true to enable ducking
1249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAudioTrackDuck(Context context, String projectPath, String audioTrackId,
1251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            boolean duck) {
1252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_SET_DUCK);
1254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_DUCK, duck);
1257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the audio track volume
1263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param volumePercentage The audio track volume (in percentage)
1268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAudioTrackVolume(Context context, String projectPath,
1270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String audioTrackId, int volumePercentage) {
1271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_SET_VOLUME);
1273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_VOLUME, volumePercentage);
1276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Mute/unmute the audio track
1282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1284ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1285ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param muted true to mute the audio track
1287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void setAudioTrackMute(Context context, String projectPath, String audioTrackId,
1289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            boolean muted) {
1290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_SET_MUTE);
1292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_MUTE, muted);
1295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Extract the audio track audio waveform
1301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The id of the audio track
1305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1306ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static void extractAudioTrackAudioWaveform(Context context, String projectPath,
1307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String audioTrackId) {
1308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (isAudioTrackAudioWaveformPending(projectPath, audioTrackId)) {
1309ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
1310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Intent intent = mIntentPool.get(context, ApiService.class);
1312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_OP, OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM);
1313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_PROJECT_PATH, projectPath);
1314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrackId);
1315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        startCommand(context, intent);
1317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Check if extract audio waveform is pending for the specified audio track
1321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
1323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
1324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return true if the extract audio waveform is pending
1326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public static boolean isAudioTrackAudioWaveformPending(String projectPath,
1328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            String audioTrackId) {
1329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (Intent intent : mPendingIntents.values()) {
1330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int op = intent.getIntExtra(PARAM_OP, -1);
1331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (op == OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM) {
1332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                String pp = intent.getStringExtra(PARAM_PROJECT_PATH);
1333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (pp.equals(projectPath)) {
1334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String mid = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
1335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mid.equals(audioTrackId)) {
1336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return true;
1337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return false;
1343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Start the service (if it is not running) with the specified Intent
1347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param context The context
1349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
1350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The request id of the pending request
1352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static String startCommand(Context context, Intent intent) {
1354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String requestId = StringUtils.randomString(8);
1355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        intent.putExtra(PARAM_REQUEST_ID, requestId);
1356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mPendingIntents.put(requestId, intent);
1357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        context.startService(intent);
1359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String projectPath = intent.getStringExtra(PARAM_PROJECT_PATH);
1361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (projectPath != null) {
1362fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            final boolean projectEdited = isProjectBeingEdited(projectPath);
1363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (projectEdited) {
1364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
1365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onProjectEditState(projectPath, projectEdited);
1366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return requestId;
1371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
1374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void onCreate() {
1375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        super.onCreate();
1376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mHandler = new Handler(Looper.getMainLooper());
1377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1378d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        mVideoThread = new IntentProcessor("VideoServiceThread");
1379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mVideoThread.start();
1380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1381d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        mAudioThread = new IntentProcessor("AudioServiceThread");
1382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mAudioThread.start();
1383d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi
1384d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        mThumbnailThread = new IntentProcessor("ThumbnailServiceThread");
1385d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi        mThumbnailThread.start();
1386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
1389d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    public int onStartCommand(final Intent intent, int flags, int startId) {
1390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int op = intent.getIntExtra(PARAM_OP, -1);
1391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch(op) {
1392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_LOAD_PROJECTS:
1393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_CREATE:
1394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_LOAD:
1395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_SAVE:
1396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_RELEASE:
1397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_DELETE:
1398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_SET_ASPECT_RATIO:
1399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_APPLY_THEME:
1400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_EXPORT:
1401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_CANCEL_EXPORT:
1402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_EXPORT_STATUS:
1403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_ADD_VIDEO_URI:
1405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_ADD_IMAGE_URI:
1406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_MOVE:
1407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_REMOVE:
1408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_RENDERING_MODE:
1409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_DURATION:
1410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_BOUNDARIES:
1411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM:
1412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM_STATUS:
1413f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            case OP_MEDIA_ITEM_LOAD:
1414f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            case OP_MEDIA_ITEM_LOAD_STATUS:
1415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_ADD_COLOR:
1417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_ADD_IMAGE_KEN_BURNS:
1418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_REMOVE:
1419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_ALPHA:
1421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_CROSSFADE:
1422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_FADE_BLACK:
1423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_SLIDING:
1424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_REMOVE:
1425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_SET_DURATION:
1426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_ADD:
1428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_REMOVE:
1429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_START_TIME:
1430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_DURATION:
1431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_ATTRIBUTES:
1432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_ADD:
1434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_REMOVE:
1435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_BOUNDARIES:
1436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM:
1437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM_STATUS: {
1438d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mVideoThread.submit(intent);
1439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
1440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
144205665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            case OP_TRANSITION_GET_THUMBNAIL: {
1443d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mThumbnailThread.submit(intent);
144405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                break;
144505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            }
144605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
1447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_GET_THUMBNAILS: {
1448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String projectPath = intent.getStringExtra(PARAM_PROJECT_PATH);
1449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
1450f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                final int token = intent.getIntExtra(PARAM_TOKEN, 0);
1451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Cancel any pending thumbnail request for the same media item
1452f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                // but with a different token
1453d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                Iterator<Intent> intentQueueIterator = mThumbnailThread.getIntentQueueIterator();
1454d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                while (intentQueueIterator.hasNext()) {
1455d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    Intent qIntent = intentQueueIterator.next();
1456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    int opi = qIntent.getIntExtra(PARAM_OP, -1);
1457d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    String pp = qIntent.getStringExtra(PARAM_PROJECT_PATH);
1458d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    String mid = qIntent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
1459f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    int tk = qIntent.getIntExtra(PARAM_TOKEN, 0);
1460f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    if (opi == op && pp.equals(projectPath) && mid.equals(mediaItemId)
1461f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            && tk != token) {
1462d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        boolean canceled = mThumbnailThread.cancel(qIntent);
1463d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        if (canceled) {
1464d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            logd("Canceled operation: " + op + " for media item" + mediaItemId);
1465d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            mPendingIntents.remove(qIntent.getStringExtra(PARAM_REQUEST_ID));
1466d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            mIntentPool.put(qIntent);
1467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1468d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        break;
1469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1471d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mThumbnailThread.submit(intent);
1472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
1473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1474ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_VOLUME:
1476ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_MUTE:
1477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1478ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_VOLUME:
1479ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_MUTE:
1480ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_LOOP:
1481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_DUCK: {
1482d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mAudioThread.submit(intent);
1483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
1484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
1487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                Log.e(TAG, "No thread assigned: " + op);
1488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
1489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return START_NOT_STICKY;
1493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
1496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void onDestroy() {
1497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        super.onDestroy();
1498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1499d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi        if (mThumbnailThread != null) {
1500d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi            mThumbnailThread.quit();
1501d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi            mThumbnailThread = null;
1502d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi        }
1503d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi
1504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mAudioThread != null) {
1505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioThread.quit();
1506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioThread = null;
1507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoThread != null) {
1510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mVideoThread.quit();
1511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mVideoThread = null;
1512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
1513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
1516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public IBinder onBind(Intent intent) {
1517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
1518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
1519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
1521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Process the intent
1522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
1523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
1524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
1525f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang    public void processIntent(final Intent intent) {
1526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int op = intent.getIntExtra(PARAM_OP, -1);
1527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        VideoEditor videoEditor = null;
1528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        try {
1529ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final String projectPath = intent.getStringExtra(PARAM_PROJECT_PATH);
1530ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Check if the project path matches the current VideoEditor project
1531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            switch (op) {
1532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_LOAD_PROJECTS:
1533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_CREATE:
1534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_LOAD:
1535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_DELETE: {
1536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                default: {
1540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor = getVideoEditor(projectPath);
1541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoEditor == null) {
1542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Invalid project path: "
1543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                + projectPath + " for operation: " + op);
1544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
1548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            switch (op) {
1550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_LOAD_PROJECTS: {
1551d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_LOAD_PROJECTS");
1552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<VideoEditorProject> projects = new ArrayList<VideoEditorProject>();
155383af1c18a2eaab1b53fd29d5c9118e1f078b6e3dGil Dobjanschi                    final File dir = FileUtils.getProjectsRootDir(getApplicationContext());
1554a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                    if (dir != null) {
1555a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                        // Collect valid projects (project with valid metadata).
1556a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                        final File[] files = dir.listFiles();
1557a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                        if (files != null) {
1558a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                            for (int i = 0; i < files.length; i++) {
1559a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                if (files[i].isDirectory()) {
1560a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    final String pp = files[i].getAbsolutePath();
1561a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    try {
1562a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        projects.add(VideoEditorProject.fromXml(null, pp));
1563a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    } catch (FileNotFoundException ex) {
1564a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        Log.w(TAG, "processIntent: Project file not found: " + pp);
1565a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        FileUtils.deleteDir(new File(pp));
1566a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    } catch (Exception ex) {
1567a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        ex.printStackTrace();
1568a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    }
1569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                }
1570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            }
1571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1572a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                            if (projects.size() > 0) {
1573a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                // Sort the projects in order of "last saved"
1574a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                Collections.sort(projects, new Comparator<VideoEditorProject>() {
1575a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    @Override
1576a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                    public int compare(VideoEditorProject object1,
1577a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                            VideoEditorProject object2) {
1578a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        if (object1.getLastSaved() > object2.getLastSaved()) {
1579a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                            return -1;
1580a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        } else if (object1.getLastSaved() == object2.getLastSaved()) {
1581a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                            return 0;
1582a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        } else {
1583a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                            return 1;
1584a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                        }
1585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    }
1586a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                                });
1587a2ae3e79b64426c53c46cbf175d1f26e26139798Shih-chia Cheng                            }
1588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, projects, null, true);
1592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_CREATE: {
1596d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_CREATE: " + projectPath);
1597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    try {
1599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Release the current video editor if any
1600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        releaseEditor();
1601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoEditor = VideoEditorFactory.create(projectPath);
1603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Add the movies to the timeline
1605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final String[] movies = intent.getStringArrayExtra(PARAM_MOVIES_FILENAMES);
1606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        for (int i = 0; i < movies.length; i++) {
1607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            final MediaItem mediaItem = new MediaVideoItem(videoEditor,
1608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    generateId(), movies[i],
1609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    MediaItem.RENDERING_MODE_BLACK_BORDER);
1610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.addMediaItem(mediaItem);
1611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Add the photos to the timeline
1614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final String[] photos = intent.getStringArrayExtra(PARAM_PHOTOS_FILENAMES);
1615ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        for (int i = 0; i < photos.length; i++) {
1616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            final MediaItem mediaItem = new MediaImageItem(videoEditor,
1617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    generateId(), photos[i],
1618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    MediaItemUtils.getDefaultImageDuration(),
1619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    MediaItem.RENDERING_MODE_BLACK_BORDER);
1620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.addMediaItem(mediaItem);
1621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Create the project
1624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final String projectName = intent.getStringExtra(PARAM_PROJECT_NAME);
1625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final String themeId = intent.getStringExtra(PARAM_THEME);
1626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (themeId != null) {
1627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            applyThemeToMovie(videoEditor, themeId);
1628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Set the aspect ratio to the aspect ratio of the first item
1631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
1632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (mediaItems.size() > 0) {
1633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.setAspectRatio(mediaItems.get(0).getAspectRatio());
1634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Create the video editor project
1637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final VideoEditorProject videoProject = new VideoEditorProject(
1638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                videoEditor, projectPath, projectName, System.currentTimeMillis(),
1639f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                0, 0, VideoEditorProject.DEFAULT_ZOOM_LEVEL, null, themeId, null);
1640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setMediaItems(copyMediaItems(
1641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                videoEditor.getAllMediaItems()));
1642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setAudioTracks(copyAudioTracks(
1643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                videoEditor.getAllAudioTracks()));
1644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Make this project the current project
1646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mVideoEditor = videoEditor;
1647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mGeneratePreviewListener = new ServiceMediaProcessingProgressListener(
1648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                projectPath);
1649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent, videoEditor, null, videoProject, null, false);
1651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        generatePreview(videoEditor, true);
1652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent);
1653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } catch (Exception ex) {
1654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (videoEditor != null) {
1655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.release();
1656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor = null;
1657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw ex;
1659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_LOAD: {
1665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor = releaseEditorNot(projectPath);
1666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1667d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    if (videoEditor == null) {  // The old project was released.
1668d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        logd("OP_VIDEO_EDITOR_LOAD: Loading: " + projectPath);
1669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        try {
1670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            // Load the project
1671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor = VideoEditorFactory.load(projectPath, false);
1672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            // Load the video editor project
1674ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            final VideoEditorProject videoProject = VideoEditorProject.fromXml(
1675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    videoEditor, projectPath);
1676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoProject.setMediaItems(copyMediaItems(
1677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    videoEditor.getAllMediaItems()));
1678ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoProject.setAudioTracks(copyAudioTracks(
1679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    videoEditor.getAllAudioTracks()));
1680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            // Make this the current project
1681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mVideoEditor = videoEditor;
1682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mGeneratePreviewListener = new ServiceMediaProcessingProgressListener(
1683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    projectPath);
1684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            completeRequest(intent, videoEditor, null, videoProject, null, false);
1686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            generatePreview(videoEditor, true);
1687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            completeRequest(intent);
1688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } catch (Exception ex) {
1689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            if (videoEditor != null) {
1690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                videoEditor.release();
1691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                videoEditor = null;
1692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            }
1693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            throw ex;
1694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1695d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    } else {  // The project is already loaded.
1696d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        logd("OP_VIDEO_EDITOR_LOAD: Was already loaded: " + projectPath);
1697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent, videoEditor, null, null, null, true);
1698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_SET_ASPECT_RATIO: {
1704d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_SET_ASPECT_RATIO");
1705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.setAspectRatio(intent.getIntExtra(PARAM_ASPECT_RATIO,
1707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            MediaProperties.ASPECT_RATIO_UNDEFINED));
1708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
1710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
1711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
1712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_APPLY_THEME: {
1716d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_APPLY_THEME");
1717ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Apply the theme
1719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    applyThemeToMovie(videoEditor, intent.getStringExtra(PARAM_THEME));
1720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<MovieMediaItem> mediaItems =
1722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            copyMediaItems(videoEditor.getAllMediaItems());
1723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<MovieAudioTrack> audioTracks =
1724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            copyAudioTracks(videoEditor.getAllAudioTracks());
1725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, mediaItems, audioTracks, false);
1727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
1728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
1729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1732ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_EXPORT: {
1733d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_EXPORT");
1734ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    exportMovie(videoEditor, intent);
1735ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1736ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1737ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1738ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_CANCEL_EXPORT: {
1739d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_CANCEL_EXPORT");
1740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.cancelExport(intent.getStringExtra(PARAM_FILENAME));
1741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, true);
1742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1743ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1745ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_EXPORT_STATUS: {
1746d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_EXPORT_STATUS");
1747ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, true);
1748ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1749ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1750ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_SAVE: {
1752d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_SAVE: " + projectPath);
1753ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.save();
1754ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
1756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoProject != null) {
1757ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.saveToXml();
1758ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1759ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, true);
1761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1762ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1764ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_RELEASE: {
1765d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_RELEASE: " + projectPath);
1766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    releaseEditor(projectPath);
1767ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, true);
1768ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1769ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1770ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1771ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_VIDEO_EDITOR_DELETE: {
1772d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_VIDEO_EDITOR_DELETE: " + projectPath);
1773ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    releaseEditor(projectPath);
1774d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    // Delete all the files and the project folder.
1775ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    FileUtils.deleteDir(new File(projectPath));
1776ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, true);
1777ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1778ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1779ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1780ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_ADD_VIDEO_URI: {
1781d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_ADD_VIDEO_URI: " +
1782d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
1783ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Uri data = intent.getParcelableExtra(PARAM_FILENAME);
1784ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String filename = null;
1785ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Get the filename
1786ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    Cursor cursor = null;
1787ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    try {
1788ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        cursor = getContentResolver().query(data,
1789ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                new String[] {Video.Media.DATA}, null, null, null);
1790ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor.moveToFirst()) {
1791ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            filename = cursor.getString(0);
1792ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1793ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } finally {
1794ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor != null) {
1795ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            cursor.close();
1796ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1797ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1798ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (filename == null) {
1800ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Media file not found: " + data);
1801ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1802ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1803ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = new MediaVideoItem(videoEditor,
1804ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
1805ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            filename,
1806ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_MEDIA_ITEM_RENDERING_MODE, 0));
1807ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1808ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.insertMediaItem(mediaItem,
1809ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
1810ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1811ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // If this is the first media item, change the aspect ratio
1812ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Integer aspectRatio;
1813ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoEditor.getAllMediaItems().size() == 1) {
1814ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoEditor.setAspectRatio(mediaItem.getAspectRatio());
1815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        aspectRatio = videoEditor.getAspectRatio();
1816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
1817ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        aspectRatio = null;
1818ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1819ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1820ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Apply the theme if any
1821ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String themeId = intent.getStringExtra(PARAM_THEME);
1822ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (themeId != null) {
1823ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        applyThemeToMediaItem(videoEditor, themeId, mediaItem);
1824ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1825ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1826ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieMediaItem(mediaItem),
1827ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            aspectRatio, false);
1828ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
1829ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
1830ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1831ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1832ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1833ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_ADD_IMAGE_URI: {
1834d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_ADD_IMAGE_URI: "
1835d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
1836ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1837ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Uri data = intent.getParcelableExtra(PARAM_FILENAME);
1838ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String filename = null;
1839ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Get the filename
1840ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    Cursor cursor = null;
1841ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    try {
1842ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        cursor = getContentResolver().query(data,
184307cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                new String[] {Images.Media.DATA, Images.Media.MIME_TYPE},
1844e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                                null, null, null);
1845ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor.moveToFirst()) {
1846ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            filename = cursor.getString(0);
184707cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                            final String mimeType = cursor.getString(1);
184807cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                            if ("image/jpeg".equals(mimeType)) {
1849e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                                try {
185007cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    final File outputFile = new File(projectPath,
185107cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                            "gallery_image_" + generateId() + ".jpg");
185207cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    if (ImageUtils.transformJpeg(filename, outputFile)) {
185307cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        filename = outputFile.getAbsolutePath();
1854e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                                    }
1855e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                                } catch (Exception ex) {
185607cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    // Ignore the exception and continue
185707cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    Log.w(TAG, "Could not transform JPEG: " + filename, ex);
1858e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                                }
1859e5b1987dea805e87bc360dbb5bb513d9247d20e9Gil Dobjanschi                            }
1860ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1861ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } finally {
1862ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor != null) {
1863ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            cursor.close();
1864ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
1865ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1866ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1867ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (filename == null) {
1868ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Media file not found: " + data);
1869ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1870ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1871ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = new MediaImageItem(videoEditor,
1872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
1873ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            filename,
1874ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
1875ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_MEDIA_ITEM_RENDERING_MODE, 0));
1876ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1877ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.insertMediaItem(mediaItem,
1878ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
1879ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1880ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // If this is the first media item, change the aspect ratio
1881ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Integer aspectRatio;
1882ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoEditor.getAllMediaItems().size() == 1) {
1883ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoEditor.setAspectRatio(mediaItem.getAspectRatio());
1884ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        aspectRatio = videoEditor.getAspectRatio();
1885ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
1886ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        aspectRatio = null;
1887ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1888ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1889ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Apply the theme if any
1890ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String themeId = intent.getStringExtra(PARAM_THEME);
1891ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (themeId != null) {
1892ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        applyThemeToMediaItem(videoEditor, themeId, mediaItem);
1893ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
1894ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1895ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieMediaItem(mediaItem),
1896ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            aspectRatio, false);
1897ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
1898ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
1899ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
1900ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
1901ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
1902f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                case OP_MEDIA_ITEM_LOAD: {
1903f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    final Uri data = intent.getParcelableExtra(PARAM_FILENAME);
1904d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_LOAD: " + data);
1905f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    final Intent requestIntent = intent;
1906f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    new Thread() {
1907f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        @Override
1908f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        public void run() {
1909f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            InputStream is = null;
1910f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            FileOutputStream fos = null;
1911f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            final File file = new File(projectPath, "download_" + generateId());
1912f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
1913f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            final Intent statusIntent = mIntentPool.get();
1914f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            statusIntent.putExtra(PARAM_OP, OP_MEDIA_ITEM_LOAD_STATUS);
1915f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            statusIntent.putExtra(PARAM_PROJECT_PATH,
1916f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    requestIntent.getStringExtra(PARAM_PROJECT_PATH));
1917f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            statusIntent.putExtra(PARAM_INTENT, requestIntent);
1918f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            try {
1919f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                is = getContentResolver().openInputStream(data);
1920f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                // Save the input stream to a file
1921f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                fos = new FileOutputStream(file);
1922f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                final byte[] readBuffer = new byte[2048];
1923f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                int readBytes;
1924f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                while ((readBytes = is.read(readBuffer)) >= 0) {
1925f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    fos.write(readBuffer, 0, readBytes);
1926f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                }
1927f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            } catch (Exception ex) {
1928f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                Log.e(TAG, "Cannot open input stream for: " + data);
1929f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                statusIntent.putExtra(PARAM_EXCEPTION, ex);
193007cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                file.delete();
1931f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            } finally {
1932f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                if (is != null) {
1933f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    try {
1934f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                        is.close();
1935f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    } catch (IOException ex) {
1936f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                        Log.e(TAG, "Cannot close input stream for: " + data);
1937f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    }
1938f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                }
1939f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
1940f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                if (fos != null) {
1941f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    try {
1942f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                        fos.flush();
1943f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                        fos.close();
1944f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    } catch (IOException ex) {
1945f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                        Log.e(TAG, "Cannot close output stream for: " + data);
1946f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                    }
1947f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                }
1948f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            }
1949f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
195007cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                            if (!statusIntent.hasExtra(PARAM_EXCEPTION)) {
195107cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                final String filename = file.getAbsolutePath();
195207cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                try {
195307cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    final String mimeType = getContentResolver().getType(data);
195407cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    if ("image/jpeg".equals(mimeType)) {
195507cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        final File outputFile = new File(projectPath,
195607cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                                "download_" + generateId() + ".jpg");
195707cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        if (ImageUtils.transformJpeg(filename, outputFile)) {
195807cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                            // Delete the downloaded file
195907cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                            file.delete();
196007cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                            statusIntent.putExtra(PARAM_FILENAME,
196107cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                                    outputFile.getAbsolutePath());
196207cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        } else {
196307cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                            statusIntent.putExtra(PARAM_FILENAME, filename);
196407cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        }
196507cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    } else {
196607cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                        statusIntent.putExtra(PARAM_FILENAME, filename);
196707cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    }
196807cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                } catch (Exception ex) {
196907cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    // Ignore the exception and continue
197007cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    Log.w(TAG, "Could not transform JPEG: " + filename, ex);
197107cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                    statusIntent.putExtra(PARAM_FILENAME, filename);
197207cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                                }
197307cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi                            }
197407cbc52a58d2394c01b5037c05df3d1ba5c40043Gil Dobjanschi
1975d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            mVideoThread.submit(statusIntent);
1976f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        }
1977f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    }.start();
1978f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
1979f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    break;
1980f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
1981f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
1982f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                case OP_MEDIA_ITEM_LOAD_STATUS: {
1983f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    final Intent originalIntent = (Intent)intent.getParcelableExtra(PARAM_INTENT);
1984f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    if (intent.hasExtra(PARAM_EXCEPTION)) { //
1985f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        final Exception exception =
1986f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                            (Exception)intent.getSerializableExtra(PARAM_EXCEPTION);
1987f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        completeRequest(intent, videoEditor, exception, null, originalIntent,
1988f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                true);
1989f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    } else {
1990f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                        completeRequest(intent, videoEditor, null,
1991f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                                intent.getStringExtra(PARAM_FILENAME), originalIntent, true);
1992f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    }
1993f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    break;
1994f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
1995f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
1996ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_MOVE: {
1997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
1998d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_MOVE: " + mediaItemId);
1999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Determine the position of the media item we are moving
2001ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
2002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int mediaItemsCount = mediaItems.size();
2003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    int movedItemPosition = -1;
2004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    MediaItem movedMediaItem = null;
2005ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (int i = 0; i < mediaItemsCount; i++) {
2006ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MediaItem mi = mediaItems.get(i);
2007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (mi.getId().equals(mediaItemId)) {
2008ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            movedMediaItem = mi;
2009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            movedItemPosition = i;
2010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            break;
2011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2012ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2013ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (movedItemPosition == -1) {
2015ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Moved MediaItem not found: " +
2016ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                mediaItemId);
2017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition beginTransition = movedMediaItem.getBeginTransition();
2020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition endTransition = movedMediaItem.getEndTransition();
2021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String afterMediaItemId = intent.getStringExtra(
2023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            PARAM_RELATIVE_STORYBOARD_ITEM_ID);
2024ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.moveMediaItem(mediaItemId, afterMediaItemId);
2025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Apply the theme if any
2027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String themeId = intent.getStringExtra(PARAM_THEME);
2028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (themeId != null) {
2029ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Apply the theme at the removed position
2030ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        applyThemeAfterMove(videoEditor, themeId, movedMediaItem,
2031ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                movedItemPosition, beginTransition, endTransition);
2032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<MovieMediaItem> mediaItemsCopy = copyMediaItems(mediaItems);
2035ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, mediaItemsCopy, null, false);
2036ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2039ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_REMOVE: {
2042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2043d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_REMOVE: " + mediaItemId);
2044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Determine the position of the media item we are removing
2046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
2047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int mediaItemsCount = mediaItems.size();
2048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    int removedItemPosition = -1;
2049ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    MediaItem removedMediaItem = null;
2050ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (int i = 0; i < mediaItemsCount; i++) {
2051ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (mediaItems.get(i).getId().equals(mediaItemId)) {
2052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            removedMediaItem = mediaItems.get(i);
2053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            removedItemPosition = i;
2054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            break;
2055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2058ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (removedMediaItem == null) {
2059ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2060ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition beginTransition = removedMediaItem.getBeginTransition();
2063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition endTransition = removedMediaItem.getEndTransition();
2064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.removeMediaItem(mediaItemId);
2066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Apply the theme if any
2068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    MovieTransition movieTransition = null;
2069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String themeId = intent.getStringExtra(PARAM_THEME);
2070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (themeId != null && mediaItems.size() > 0) {
2071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final Transition transition = applyThemeAfterRemove(videoEditor, themeId,
2072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                removedItemPosition, beginTransition, endTransition);
2073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (transition != null) {
2074ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            movieTransition = new MovieTransition(transition);
2075ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2076ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2077ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, movieTransition, null, false);
2079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2082ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2083ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_RENDERING_MODE: {
2085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2086d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_SET_RENDERING_MODE: " + mediaItemId);
2087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2088ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(mediaItemId);
2089ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2090ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2091ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2092ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.setRenderingMode(intent.getIntExtra(PARAM_MEDIA_ITEM_RENDERING_MODE,
2093ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            MediaItem.RENDERING_MODE_BLACK_BORDER));
2094ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2095ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2096ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2097ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2098ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2099ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_DURATION: {
2102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2103d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_SET_DURATION: " + mediaItemId);
2104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaImageItem mediaItem =
2106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        (MediaImageItem)videoEditor.getMediaItem(mediaItemId);
2107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final long durationMs = intent.getLongExtra(PARAM_DURATION, 0);
2112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.setDuration(durationMs);
2113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Adjust all effects to the new duration
2114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<Effect> effects = mediaItem.getAllEffects();
2115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (Effect effect : effects) {
2116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        effect.setDuration(durationMs);
2117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieMediaItem(mediaItem), null,
2120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            false);
2121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_BOUNDARIES: {
2127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaVideoItem mediaItem =
2129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        (MediaVideoItem)videoEditor.getMediaItem(mediaItemId);
2130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.setExtractBoundaries(intent.getLongExtra(PARAM_BEGIN_BOUNDARY, 0),
2135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_END_BOUNDARY, 0));
2136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final List<Overlay> overlays = mediaItem.getAllOverlays();
2138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlays.size() > 0) {
2139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // Adjust the overlay
2140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final Overlay overlay = overlays.get(0);
2141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (overlay.getStartTime() < mediaItem.getBoundaryBeginTime()) {
2142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setStartTime(mediaItem.getBoundaryBeginTime());
2143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setDuration(Math.min(overlay.getDuration(),
2144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mediaItem.getTimelineDuration()));
2145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else if (overlay.getStartTime() + overlay.getDuration() >
2146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mediaItem.getBoundaryEndTime()) {
2147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setStartTime(Math.max(mediaItem.getBoundaryBeginTime(),
2148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mediaItem.getBoundaryEndTime() - overlay.getDuration()));
2149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setDuration(mediaItem.getBoundaryEndTime() -
2150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    overlay.getStartTime());
2151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieMediaItem(mediaItem), null,
2155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            false);
2156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_GET_THUMBNAILS: {
2162d15e9cf8eab634dc3b95a945dcd1b4e634d9a026Gil Dobjanschi                    // Note that this command is executed in the thumbnail thread
2163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2164d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_GET_THUMBNAILS: " + mediaItemId);
2165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(mediaItemId);
2167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2171f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    final VideoEditor ve = videoEditor; // Just to make it "final"
2172f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    mediaItem.getThumbnailList(
2173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_WIDTH, 0),
2174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_HEIGHT, 0),
2175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_START_TIME, 0),
2176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_END_TIME, 0),
2177f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            intent.getIntExtra(PARAM_COUNT, 0),
2178f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            intent.getIntArrayExtra(PARAM_INDICES),
2179f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            new GetThumbnailListCallback() {
2180f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                                public void onThumbnail(Bitmap bitmap, int index) {
2181f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                                    completeRequest(
2182f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                                            intent, ve, null, bitmap,
2183f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                                            Integer.valueOf(index), false);
2184f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                                }
2185f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            }
2186f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            );
2187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2188f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    completeRequest(intent, videoEditor, null, null, null, true);
2189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_VOLUME: {
2193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2194d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_SET_VOLUME: " + mediaItemId);
2195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(mediaItemId);
2197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null && mediaItem instanceof MediaVideoItem) {
2198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        ((MediaVideoItem)mediaItem).setVolume(intent.getIntExtra(PARAM_VOLUME, 0));
2199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent, videoEditor, null, null, null, false);
2201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        generatePreview(videoEditor, false);
2202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent);
2203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_SET_MUTE: {
2210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2211d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_SET_MUTE: " + mediaItemId);
2212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(mediaItemId);
2214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null && mediaItem instanceof MediaVideoItem) {
2215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        ((MediaVideoItem)mediaItem).setMute(intent.getBooleanExtra(PARAM_MUTE,
2216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                false));
2217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent, videoEditor, null, null, null, false);
2219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        generatePreview(videoEditor, false);
2220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent);
2221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2225ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2226ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2227ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM: {
2228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2229d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM: " + mediaItemId);
2230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(mediaItemId);
2232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null && mediaItem instanceof MediaVideoItem) {
2233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MediaVideoItem movieMediaItem = ((MediaVideoItem)mediaItem);
2234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final WaveformData waveformData = movieMediaItem.getWaveformData();
2235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (waveformData == null) {
223689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            extractMediaItemAudioWaveform(intent, videoEditor, movieMediaItem);
223789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            completeRequest(intent, videoEditor, null,
223889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                                    movieMediaItem.getWaveformData(), null, true);
2239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
2240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            completeRequest(intent, videoEditor, null, waveformData, null, true);
2241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " + mediaItemId);
2244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_INSERT_ALPHA: {
2249d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_INSERT_ALPHA: "
2250d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String afterMediaItemId =
2253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
2254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem afterMediaItem;
2255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (afterMediaItemId != null) {
2256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = videoEditor.getMediaItem(afterMediaItemId);
2257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = null;
2259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int maskRawResourceId = intent.getIntExtra(PARAM_TRANSITION_MASK,
2262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            R.raw.mask_contour);
2263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem beforeMediaItem = nextMediaItem(videoEditor, afterMediaItemId);
2265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = new TransitionAlpha(
2266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItem, beforeMediaItem,
2268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
2269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_TRANSITION_BEHAVIOR,
2270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Transition.BEHAVIOR_LINEAR),
2271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    FileUtils.getMaskFilename(getApplicationContext(),
2272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                            maskRawResourceId),
2273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_TRANSITION_BLENDING, 100),
2274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getBooleanExtra(PARAM_TRANSITION_INVERT, false));
2275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
2276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, transition, null, false);
2278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_INSERT_CROSSFADE: {
2284d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_INSERT_CROSSFADE: "
2285d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String afterMediaItemId =
2288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
2289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem afterMediaItem;
2290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (afterMediaItemId != null) {
2291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = videoEditor.getMediaItem(afterMediaItemId);
2292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = null;
2294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem beforeMediaItem = nextMediaItem(videoEditor, afterMediaItemId);
2297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = new TransitionCrossfade(
2298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItem, beforeMediaItem,
2300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
2301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_TRANSITION_BEHAVIOR,
2302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Transition.BEHAVIOR_LINEAR));
2303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
2304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, transition, null, false);
2306ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2309ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_INSERT_FADE_BLACK: {
2312d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_INSERT_FADE_TO_BLACK: "
2313d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String afterMediaItemId =
2316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
2317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem afterMediaItem;
2318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (afterMediaItemId != null) {
2319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = videoEditor.getMediaItem(afterMediaItemId);
2320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = null;
2322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem beforeMediaItem = nextMediaItem(videoEditor, afterMediaItemId);
2325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = new TransitionFadeBlack(
2326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItem, beforeMediaItem,
2328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
2329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_TRANSITION_BEHAVIOR,
2330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Transition.BEHAVIOR_LINEAR));
2331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
2332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, transition, null, false);
2334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_INSERT_SLIDING: {
2340d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_INSERT_SLIDING: "
2341d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String afterMediaItemId =
2344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
2345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem afterMediaItem;
2346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (afterMediaItemId != null) {
2347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = videoEditor.getMediaItem(afterMediaItemId);
2348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        afterMediaItem = null;
2350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem beforeMediaItem = nextMediaItem(videoEditor, afterMediaItemId);
2353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = new TransitionSliding(
2354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItem, beforeMediaItem,
2356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
2357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_TRANSITION_BEHAVIOR,
2358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Transition.BEHAVIOR_LINEAR),
2359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    intent.getIntExtra(PARAM_TRANSITION_DIRECTION,
2360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                            TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN));
2361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
2362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, transition, null, false);
2364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_REMOVE: {
2370d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_REMOVE: "
2371d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.removeTransition(intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_SET_DURATION: {
2382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String transitionId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2383d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_SET_DURATION: " + transitionId);
2384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = videoEditor.getTransition(transitionId);
2386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (transition == null) {
2387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Transition not found: " +
2388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                transitionId);
2389ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    transition.setDuration(intent.getLongExtra(PARAM_DURATION, 0));
2391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_TRANSITION_GET_THUMBNAIL: {
2399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String transitionId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2400d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_TRANSITION_GET_THUMBNAIL: " + transitionId);
2401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = videoEditor.getTransition(transitionId);
2403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (transition == null) {
2404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Transition not found: " +
2405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                transitionId);
2406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int height = intent.getIntExtra(PARAM_HEIGHT, 0);
2409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem afterMediaItem = transition.getAfterMediaItem();
2410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Bitmap[] thumbnails = new Bitmap[2];
2411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (afterMediaItem != null) {
2412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        thumbnails[0] = afterMediaItem.getThumbnail(
2413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                (afterMediaItem.getWidth() * height) / afterMediaItem.getHeight(),
2414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                height, afterMediaItem.getTimelineDuration());
2415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        thumbnails[0] = null;
2417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem beforeMediaItem = transition.getBeforeMediaItem();
2420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (beforeMediaItem != null) {
2421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        thumbnails[1] = beforeMediaItem.getThumbnail(
2422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                (beforeMediaItem.getWidth() * height) / beforeMediaItem.getHeight(),
2423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                height, 0);
2424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        thumbnails[1] = null;
2426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, thumbnails, null, true);
2429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_EFFECT_ADD_COLOR: {
2433d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_EFFECT_ADD_COLOR: "
2434d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
244305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    // Remove any existing effect
244405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    final List<Effect> effects = mediaItem.getAllEffects();
244505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    for (Effect effect : effects) {
244605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        mediaItem.removeEffect(effect.getId());
244705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    }
244805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
2449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Effect effect = new EffectColor(mediaItem,
2450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_START_TIME, -1),
2452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0),
2453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_EFFECT_TYPE, -1),
2454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getIntExtra(PARAM_EFFECT_PARAM, -1));
2455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.addEffect(effect);
2456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieEffect(effect), null,
2458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            false);
2459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2460ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2464ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_EFFECT_ADD_IMAGE_KEN_BURNS: {
2465d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_EFFECT_ADD_IMAGE_KEN_BURNS: "
2466d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2474ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
247505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    // Remove any existing effect
247605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    final List<Effect> effects = mediaItem.getAllEffects();
247705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    for (Effect effect : effects) {
247805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        mediaItem.removeEffect(effect.getId());
247905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    }
248005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
2481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Effect effect = new EffectKenBurns(mediaItem,
2482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            (Rect)intent.getParcelableExtra(PARAM_MEDIA_ITEM_START_RECT),
2484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            (Rect)intent.getParcelableExtra(PARAM_MEDIA_ITEM_END_RECT),
2485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_START_TIME, 0),
2486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0));
2487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.addEffect(effect);
2488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieEffect(effect), null,
2490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            false);
2491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_EFFECT_REMOVE: {
2497d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_EFFECT_REMOVE: " + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.removeEffect(intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_OVERLAY_ADD: {
2515d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_OVERLAY_ADD: " + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
252405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    // Remove any existing overlays
252505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    final List<Overlay> overlays = mediaItem.getAllOverlays();
252605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    for (Overlay overlay : overlays) {
252705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        mediaItem.removeOverlay(overlay.getId());
252805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    }
252905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
2530ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int scaledWidth, scaledHeight;
2531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem instanceof MediaVideoItem) {
2532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledWidth = ((MediaVideoItem)mediaItem).getWidth();
2533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledHeight = ((MediaVideoItem)mediaItem).getHeight();
2534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledWidth = ((MediaImageItem)mediaItem).getScaledWidth();
2536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledHeight = ((MediaImageItem)mediaItem).getScaledHeight();
2537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Bundle userAttributes = intent.getBundleExtra(PARAM_ATTRIBUTES);
2540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int overlayType = MovieOverlay.getType(userAttributes);
2542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String title = MovieOverlay.getTitle(userAttributes);
2543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String subTitle = MovieOverlay.getSubtitle(userAttributes);
2544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final OverlayFrame overlay = new OverlayFrame(mediaItem,
2546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
2547194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                            ImageUtils.buildOverlayBitmap(getApplicationContext(), null,
2548194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                                    overlayType, title, subTitle, scaledWidth, scaledHeight),
2549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_START_TIME, -1),
2550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0));
2551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Set the user attributes
2553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (String name : userAttributes.keySet()) {
2554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (MovieOverlay.getAttributeType(name).equals(Integer.class)) {
2555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setUserAttribute(name,
2556ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Integer.toString(userAttributes.getInt(name)));
2557ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else { // Strings
2558ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setUserAttribute(name, userAttributes.getString(name));
2559ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.addOverlay(overlay);
2562ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2563ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieOverlay(overlay), null,
2564ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            false);
2565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2566ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2567ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_OVERLAY_REMOVE: {
2571d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_OVERLAY_REMOVE: " + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2573ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2578ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.removeOverlay(intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2586ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2587ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_OVERLAY_SET_START_TIME: {
2589d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_OVERLAY_SET_START_TIME: "
2590d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Overlay overlay = mediaItem.getOverlay(
2600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlay == null) {
2602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Overlay not found: " +
2603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    overlay.setStartTime(intent.getLongExtra(PARAM_START_TIME, 0));
2607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_OVERLAY_SET_DURATION: {
2615d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_OVERLAY_SET_DURATION: "
2616d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Overlay overlay = mediaItem.getOverlay(
2626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlay == null) {
2628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Overlay not found: " +
2629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    overlay.setDuration(intent.getLongExtra(PARAM_DURATION, 0));
2633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_OVERLAY_SET_ATTRIBUTES: {
2641d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_OVERLAY_SET_ATTRIBUTES: "
2642d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MediaItem mediaItem = videoEditor.getMediaItem(
2645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem == null) {
2647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("MediaItem not found: " +
2648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID));
2649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Overlay overlay = mediaItem.getOverlay(
2652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlay == null) {
2654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Overlay not found: " +
2655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int scaledWidth, scaledHeight;
2659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem instanceof MediaVideoItem) {
2660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledWidth = ((MediaVideoItem)mediaItem).getWidth();
2661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledHeight = ((MediaVideoItem)mediaItem).getHeight();
2662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledWidth = ((MediaImageItem)mediaItem).getScaledWidth();
2664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        scaledHeight = ((MediaImageItem)mediaItem).getScaledHeight();
2665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Bundle userAttributes = intent.getBundleExtra(PARAM_ATTRIBUTES);
2668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int overlayType = MovieOverlay.getType(userAttributes);
2669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String title = MovieOverlay.getTitle(userAttributes);
2670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String subTitle = MovieOverlay.getSubtitle(userAttributes);
2671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    ((OverlayFrame)overlay).setBitmap(
2673194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                            ImageUtils.buildOverlayBitmap(getApplicationContext(), null,
2674194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                                    overlayType, title, subTitle, scaledWidth, scaledHeight));
2675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (String name : userAttributes.keySet()) {
2677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (MovieOverlay.getAttributeType(name).equals(Integer.class)) {
2678ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setUserAttribute(name,
2679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    Integer.toString(userAttributes.getInt(name)));
2680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else { // Strings
2681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setUserAttribute(name, userAttributes.getString(name));
2682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, true);
2687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_ADD: {
2692d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_ADD: " + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Uri data = intent.getParcelableExtra(PARAM_FILENAME);
2695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    String filename = null;
2696ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Get the filename
2697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    Cursor cursor = null;
2698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    try {
2699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        cursor = getContentResolver().query(data,
2700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                new String[] {Audio.Media.DATA}, null, null, null);
2701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor.moveToFirst()) {
2702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            filename = cursor.getString(0);
2703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2704ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } finally {
2705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (cursor != null) {
2706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            cursor.close();
2707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
2708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (filename == null) {
2711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("Media file not found: " + data);
2712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = new AudioTrack(videoEditor,
2715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID), filename);
2716516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                    audioTrack.enableDucking(DUCK_THRESHOLD, DUCK_TRACK_VOLUME);
2717516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                    audioTrack.setVolume(DEFAULT_AUDIO_TRACK_VOLUME);
2718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (intent.getBooleanExtra(PARAM_LOOP, false)) {
2719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        audioTrack.enableLoop();
2720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        audioTrack.disableLoop();
2722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addAudioTrack(audioTrack);
2725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, new MovieAudioTrack(audioTrack),
2727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            null, false);
2728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // This is needed to decode the audio file into a PCM file
2729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2732ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2733ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2734ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_REMOVE: {
2735d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_REMOVE: "
2736d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            + intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2737ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2738ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.removeAudioTrack(intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID));
2739ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2743ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2745ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2746ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_BOUNDARIES: {
2747ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2748d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_SET_BOUNDARIES: " + audioTrackId);
2749ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2750ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2752ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2753ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2754ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    audioTrack.setExtractBoundaries(intent.getLongExtra(PARAM_BEGIN_BOUNDARY, 0),
2757ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_END_BOUNDARY, 0));
2758ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2759ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2762ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2764ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2765ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_LOOP: {
2766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2767d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_SET_LOOP: " + audioTrackId);
2768ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2769ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2770ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2771ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2772ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2773ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2774ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2775ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (intent.getBooleanExtra(PARAM_LOOP, false)) {
2776ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        audioTrack.enableLoop();
2777ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2778ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        audioTrack.disableLoop();
2779ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2780ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2781ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2782ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2783ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2784ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2785ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2786ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2787ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_DUCK: {
2788ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2789d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_SET_DUCK: " + audioTrackId);
2790ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2791ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2792ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2793ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2794ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2795ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2796ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2797ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (intent.getBooleanExtra(PARAM_DUCK, false)) {
2798516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                        audioTrack.enableDucking(DUCK_THRESHOLD, DUCK_TRACK_VOLUME);
2799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2800ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        audioTrack.disableDucking();
2801ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2802ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2803ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2804ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2805ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2806ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2807ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2808ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2809ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_VOLUME: {
2810ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2811d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_SET_VOLUME: " + audioTrackId);
2812ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2813ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2814ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2817ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2818ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2819ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    audioTrack.setVolume(intent.getIntExtra(PARAM_VOLUME, 0));
2820ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2821ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2822ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2823ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2824ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2825ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2826ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2827ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_SET_MUTE: {
2828ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2829d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_SET_MUTE: " + audioTrackId);
2830ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2831ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2832ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2833ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2834ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2835ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2836ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2837ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    audioTrack.setMute(intent.getBooleanExtra(PARAM_MUTE, false));
2838ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2839ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent, videoEditor, null, null, null, false);
2840ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    generatePreview(videoEditor, false);
2841ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    completeRequest(intent);
2842ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2843ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2844ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2845ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                case OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM: {
2846ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
2847d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logd("OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM: " + audioTrackId);
2848ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2849ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final AudioTrack audioTrack = videoEditor.getAudioTrack(audioTrackId);
2850ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack == null) {
2851ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        throw new IllegalArgumentException("AudioTrack not found: " +
2852ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrackId);
2853ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2854ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2855ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final WaveformData waveformData = audioTrack.getWaveformData();
2856ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (waveformData == null) {
285789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        extractAudioTrackAudioWaveform(intent, videoEditor, audioTrack);
285889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        completeRequest(intent, videoEditor, null, audioTrack.getWaveformData(),
285989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                                null, true);
2860ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
2861ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        completeRequest(intent, videoEditor, null, waveformData, null, true);
2862ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2863ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
2864ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2865ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2866ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                default: {
2867ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    throw new IllegalArgumentException("Unhandled operation: " + op);
2868ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2869ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2870ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } catch (Exception ex) {
2871ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            ex.printStackTrace();
2872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            completeRequest(intent, videoEditor, ex, null, null, true);
2873ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
2874ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
2875ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2876ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
2877ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Complete the request
2878ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
2879ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
2880ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
2881ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param exception The exception
2882ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param result The result object
2883ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param extraResult The extra result object
2884ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param finalize true if the request should be finalized
2885ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
2886ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void completeRequest(final Intent intent, final VideoEditor videoEditor,
2887ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final Exception exception, final Object result, final Object extraResult,
2888ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final boolean finalize) {
2889d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        mHandler.post(new Runnable() {
2890258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng            @Override
2891ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void run() {
2892ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                onIntentProcessed(intent, videoEditor, result, extraResult, exception, finalize);
2893ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2894ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        });
2895ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
2896ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2897ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
2898ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Complete the request
2899ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
2900ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
2901ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
2902ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void completeRequest(final Intent intent) {
2903ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mHandler.post (new Runnable() {
2904258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng            @Override
2905ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void run() {
2906ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                finalizeRequest(intent);
2907ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mIntentPool.put(intent);
2908ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2909ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        });
2910ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
2911ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2912ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
2913d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * Callback called after the specified intent is processed.
2914ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
2915ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
2916ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The VideoEditor on which the operation was performed
2917ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param result The result object
2918ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param extraResult The extra result object
2919ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param ex The exception
2920ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param finalize true if the request should be finalized
2921ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
2922ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @SuppressWarnings("unchecked")
2923ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void onIntentProcessed(final Intent intent, VideoEditor videoEditor,
2924ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Object result, Object extraResult, Exception ex, boolean finalize) {
2925ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2926ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String projectPath = intent.getStringExtra(PARAM_PROJECT_PATH);
2927ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int op = intent.getIntExtra(PARAM_OP, -1);
2928ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (op) {
2929ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_LOAD_PROJECTS: {
2930ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
2931ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
2932ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2933ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2934ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final List<VideoEditorProject> projects = (List<VideoEditorProject>)result;
2935ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
2936ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onProjectsLoaded(projects, ex);
2937ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2938ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2939ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
2940ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2941ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2942ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_CREATE: {
2943ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
2944ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
2945ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2946ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2947ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Release the old project
2948ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mVideoProject != null) {
2949ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mVideoProject.release();
2950ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mVideoProject = null;
2951ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2952ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2953ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (ex != null) {
2954ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    FileUtils.deleteDir(new File(projectPath));
2955ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else {
2956ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mVideoProject = (VideoEditorProject)result;
2957ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2958ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2959ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
2960ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorCreated(projectPath, mVideoProject,
2961ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor != null ? videoEditor.getAllMediaItems() : null,
2962ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor != null ? videoEditor.getAllAudioTracks() : null, ex);
2963ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2964ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2965ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
2966ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2967ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2968ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_LOAD: {
2969ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
2970ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
2971ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2972ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2973ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (result != null) { // A new project was created
2974ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mVideoProject != null) {
2975ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mVideoProject.release();
2976ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mVideoProject = null;
2977ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
2978ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mVideoProject = (VideoEditorProject)result;
2979ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2980ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2981ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
2982ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorLoaded(projectPath, mVideoProject,
2983ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            ex == null ? videoEditor.getAllMediaItems() : null,
2984ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            ex == null ? videoEditor.getAllAudioTracks() : null, ex);
2985ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2986ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2987ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
2988ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
2989ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2990ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_SET_ASPECT_RATIO: {
2991ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
2992ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
2993ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
2994ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
2995ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int aspectRatio = intent.getIntExtra(PARAM_ASPECT_RATIO,
2996ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        MediaProperties.ASPECT_RATIO_UNDEFINED);
2997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (ex == null) {
2998ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
2999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoProject != null) {
3000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setAspectRatio(aspectRatio);
3001ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3005ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorAspectRatioSet(projectPath, aspectRatio, ex);
3006ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3008ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_APPLY_THEME: {
3012ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3013ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3015ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3016ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String theme = intent.getStringExtra(PARAM_THEME);
3017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (ex == null) {
3018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
3019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoProject != null) {
3020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setTheme(theme);
3021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setMediaItems((List<MovieMediaItem>)result);
3022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setAudioTracks((List<MovieAudioTrack>)extraResult);
3023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3024ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorThemeApplied(projectPath, theme, ex);
3028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3029ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3030ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3031ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_GENERATE_PREVIEW_PROGRESS: {
3034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String className = intent.getStringExtra(PARAM_ATTRIBUTES);
3035ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String itemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3036ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int action = intent.getIntExtra(PARAM_ACTION,
3037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        VideoEditor.MediaProcessingProgressListener.ACTION_DECODE);
3038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int progress = intent.getIntExtra(PARAM_PROGRESS_VALUE, 0);
3039ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorGeneratePreviewProgress(projectPath, className, itemId,
3042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            action, progress);
3043ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_EXPORT: {
3049378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                // The finalizeRequest() call and listener callbacks are done in
3050378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                // OP_VIDEO_EDITOR_EXPORT_STATUS intent handling (where we are
3051378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                // called originalIntent).
3052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_CANCEL_EXPORT: {
3056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3058ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3059ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3060ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorExportCanceled(projectPath,
3062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_FILENAME));
3063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_EXPORT_STATUS: {
3068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // This operation is for the service internal use only
3069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String filename = intent.getStringExtra(PARAM_FILENAME);
3074ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (intent.hasExtra(PARAM_EXCEPTION)) { // Complete
3075f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    final Intent originalIntent = (Intent)intent.getParcelableExtra(PARAM_INTENT);
3076f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    finalizeRequest(originalIntent);
3077f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    mIntentPool.put(originalIntent);
3078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Exception exception =
3080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        (Exception)intent.getSerializableExtra(PARAM_EXCEPTION);
3081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
3082378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                    final boolean cancelled = intent.getBooleanExtra(PARAM_CANCELLED, false);
3083378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                    if (!cancelled && videoProject != null && exception == null) {
3084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final Uri uri = (Uri)intent.getParcelableExtra(PARAM_MOVIE_URI);
3085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.addExportedMovieUri(uri);
3086ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3088ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (ApiServiceListener listener : mListeners) {
3089378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                        listener.onVideoEditorExportComplete(
3090378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                                projectPath, filename, exception, cancelled);
3091ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3092ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else { // Progress
3093ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    for (ApiServiceListener listener : mListeners) {
3094ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        listener.onVideoEditorExportProgress(projectPath, filename,
3095ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                intent.getIntExtra(PARAM_PROGRESS_VALUE, -1));
3096ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3097ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3098ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // The original request is still pending
3099ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_SAVE: {
3104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorSaved(projectPath, ex);
3110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_RELEASE: {
3115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoProject.release();
3122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mVideoProject == videoProject) {
3123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mVideoProject = null;
3124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorReleased(projectPath, ex);
3129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_VIDEO_EDITOR_DELETE: {
3135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoProject.release();
3142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mVideoProject == videoProject) {
3143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        mVideoProject = null;
3144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onVideoEditorDeleted(projectPath, ex);
3149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_ADD_VIDEO_URI: {
3155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String afterMediaItemId =
3160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieMediaItem movieMediaItem = (MovieMediaItem)result;
3163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null && extraResult != null) {
3166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // The aspect ratio has changed
3167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setAspectRatio((Integer)extraResult);
3168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.insertMediaItem(movieMediaItem, afterMediaItemId);
3172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemAdded(projectPath,
3177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID), movieMediaItem,
3178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItemId, MediaVideoItem.class, (Integer)extraResult, ex);
3179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_ADD_IMAGE_URI: {
3185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String afterMediaItemId =
3190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieMediaItem movieMediaItem = (MovieMediaItem)result;
3193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null && extraResult != null) {
3196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        // The aspect ratio has changed
3197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setAspectRatio((Integer)extraResult);
3198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.insertMediaItem(movieMediaItem, afterMediaItemId);
3202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemAdded(projectPath,
3207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID), movieMediaItem,
3208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItemId, MediaImageItem.class, (Integer)extraResult, ex);
3209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3214f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            case OP_MEDIA_ITEM_LOAD: {
3215f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                // Note that this message is handled only if the download
3216f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                // cannot start.
3217f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final Uri data = (Uri)intent.getParcelableExtra(PARAM_FILENAME);
3218f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final String mimeType = intent.getStringExtra(PARAM_ATTRIBUTES);
3219f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                if (finalize) {
3220f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    finalizeRequest(intent);
3221f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
3222f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3223f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3224f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    listener.onMediaLoaded(projectPath, data, mimeType, null, ex);
3225f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
3226f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                break;
3227f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            }
3228f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3229f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            case OP_MEDIA_ITEM_LOAD_STATUS: {
3230f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                if (finalize) {
3231f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    finalizeRequest(intent);
3232f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
3233f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3234f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final Intent originalIntent = (Intent)intent.getParcelableExtra(PARAM_INTENT);
3235f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final Uri data = (Uri)originalIntent.getParcelableExtra(PARAM_FILENAME);
3236f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final String mimeType = originalIntent.getStringExtra(PARAM_ATTRIBUTES);
3237f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3238f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                finalizeRequest(originalIntent);
3239f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                mIntentPool.put(originalIntent);
3240f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3241f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                final String filename = intent.getStringExtra(PARAM_FILENAME);
3242f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3243f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                if (ex == null && filename != null) {
3244f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
3245f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    videoProject.addDownload(data.toString(), mimeType, filename);
3246f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
3247f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3248f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3249f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                    listener.onMediaLoaded(projectPath, data, mimeType, filename, ex);
3250f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                }
3251f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi                break;
3252f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi            }
3253f69cd2d4db2fb4f4c268e33e9728773480b298a4Gil Dobjanschi
3254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_MOVE: {
3255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (ex == null) {
3260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
3261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoProject != null) {
3262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.setMediaItems((List<MovieMediaItem>)result);
3263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemMoved(projectPath,
3268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
3269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_RELATIVE_STORYBOARD_ITEM_ID), ex);
3270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_REMOVE: {
3276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieTransition transition = (MovieTransition)result;
3282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (ex == null) {
3283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final VideoEditorProject videoProject = getProject(projectPath);
3284ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (videoProject != null) {
3285ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.removeMediaItem(mediaItemId, transition);
3286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemRemoved(projectPath, mediaItemId, transition, ex);
3291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_RENDERING_MODE: {
3297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int renderingMode = intent.getIntExtra(PARAM_MEDIA_ITEM_RENDERING_MODE,
3303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        MediaItem.RENDERING_MODE_BLACK_BORDER);
3304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3306ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieMediaItem mediaItem = videoProject.getMediaItem(mediaItemId);
3308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null) {
330905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setRenderingMode(renderingMode);
3312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setAppRenderingMode(mediaItem.getRenderingMode());
3314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemRenderingModeSet(projectPath, mediaItemId, renderingMode,
3320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            ex);
3321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_DURATION: {
3327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.updateMediaItem((MovieMediaItem)result);
3337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
3338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MovieMediaItem oldMediaItem = videoProject.getMediaItem(mediaItemId);
3339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (oldMediaItem != null) {
334005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
3341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            oldMediaItem.setAppExtractBoundaries(0, oldMediaItem.getDuration());
3342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemDurationSet(projectPath, mediaItemId,
3348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_DURATION, 0), ex);
3349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_BOUNDARIES: {
3355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MovieMediaItem mediaItem = (MovieMediaItem)result;
3365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.updateMediaItem(mediaItem);
3366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
3367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MovieMediaItem oldMediaItem = videoProject.getMediaItem(mediaItemId);
3368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (oldMediaItem != null) {
336905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
3370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            oldMediaItem.setAppExtractBoundaries(
3371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    oldMediaItem.getBoundaryBeginTime(),
3372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    oldMediaItem.getBoundaryEndTime());
3373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onMediaItemBoundariesSet(projectPath, mediaItemId,
3379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_BEGIN_BOUNDARY, 0),
3380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getLongExtra(PARAM_END_BOUNDARY, 0), ex);
3381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3386f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang            case OP_MEDIA_ITEM_GET_THUMBNAILS: {
3387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3389f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                    break;
3390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Bitmap bitmap = (Bitmap)result;
3393f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                final int index = (Integer)extraResult;
3394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                boolean used = false;
3395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    used |= listener.onMediaItemThumbnail(projectPath,
3397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
3398f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            bitmap, index, intent.getIntExtra(PARAM_TOKEN, 0),
3399f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang                            ex);
3400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (used == false) {
3403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (bitmap != null) {
3404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        bitmap.recycle();
3405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_VOLUME: {
3412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieMediaItem mediaItem = videoProject.getMediaItem(mediaItemId);
3420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null) {
342105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setVolume(intent.getIntExtra(PARAM_VOLUME, 0));
3424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setAppVolume(mediaItem.getVolume());
3426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_SET_MUTE: {
3434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieMediaItem mediaItem = videoProject.getMediaItem(mediaItemId);
3442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (mediaItem != null) {
344305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3445ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setMute(intent.getBooleanExtra(PARAM_MUTE, false));
3446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setAppMute(mediaItem.isMuted());
3448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM_STATUS: {
3456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3460ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
346189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final int progress = intent.getIntExtra(PARAM_PROGRESS_VALUE, 0);
3462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
346389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
346489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    listener.onMediaItemExtractAudioWaveformProgress(projectPath, mediaItemId,
346589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        progress);
3466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM: {
347289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                if (finalize) {
347389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    finalizeRequest(intent);
347489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                }
3475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
347689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final String mediaItemId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
347889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
347989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                if (ex == null && videoProject != null) {
348089489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    if (result != null) {
348105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        final MovieMediaItem mediaItem = videoProject.getMediaItem(mediaItemId);
348289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        if (mediaItem != null) {
348305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
3484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItem.setWaveformData((WaveformData)result);
3485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
348789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                }
3488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
348989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
349005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                    listener.onMediaItemExtractAudioWaveformComplete(projectPath, mediaItemId, ex);
3491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_ALPHA:
3497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_CROSSFADE:
3498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_FADE_BLACK:
3499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_INSERT_SLIDING: {
3500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String afterMediaItemId = intent.getStringExtra(
3505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieTransition movieTransition;
3508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = (Transition)result;
3511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // This is null for start transitions
3512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        movieTransition = new MovieTransition(transition);
3514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.addTransition(movieTransition, afterMediaItemId);
3515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
3516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        movieTransition = null;
3517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else {
3519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    movieTransition = null;
3520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onTransitionInserted(projectPath, movieTransition,
3524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            afterMediaItemId, ex);
3525ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3529ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3530ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_REMOVE: {
3531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String transitionId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.removeTransition(transitionId);
3541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onTransitionRemoved(projectPath, transitionId, ex);
3546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_SET_DURATION: {
3552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3556ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String transitionId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3557ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final long durationMs = intent.getLongExtra(PARAM_DURATION, 0);
3558ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3559ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieTransition transition = videoProject.getTransition(transitionId);
3562ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (transition != null) {
356305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3564ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            transition.setDuration(durationMs);
3566ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3567ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            transition.setAppDuration(transition.getDuration());
3568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3573ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onTransitionDurationSet(projectPath, transitionId, durationMs, ex);
3574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3578ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_TRANSITION_GET_THUMBNAIL: {
3580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Bitmap[] bitmaps = (Bitmap[])result;
3585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                boolean used = false;
3586ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3587ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    used |= listener.onTransitionThumbnails(projectPath,
3588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID),
3589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            bitmaps, ex);
3590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (used == false) {
3593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (bitmaps != null) {
3594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        for (int i = 0; i < bitmaps.length; i++) {
3595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            if (bitmaps[i] != null) {
3596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                bitmaps[i].recycle();
3597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            }
3598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_ADD: {
3606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieOverlay movieOverlay = (MovieOverlay)result;
3614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3615ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.addOverlay(mediaItemId, movieOverlay);
3618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onOverlayAdded(projectPath, movieOverlay, mediaItemId, ex);
3623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_REMOVE: {
3629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String overlayId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.removeOverlay(mediaItemId, overlayId);
3641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onOverlayRemoved(projectPath, overlayId, mediaItemId, ex);
3646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_START_TIME: {
3652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String overlayId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final long startTimeMs = intent.getLongExtra(PARAM_START_TIME, 0);
3660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieOverlay overlay = videoProject.getOverlay(mediaItemId, overlayId);
3664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlay != null) {
366505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setStartTime(startTimeMs);
3668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setAppStartTime(overlay.getStartTime());
3670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3674ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onOverlayStartTimeSet(projectPath, overlayId, mediaItemId,
3676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            startTimeMs, ex);
3677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3678ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_DURATION: {
3683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String overlayId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final long durationMs = intent.getLongExtra(PARAM_DURATION, 0);
3691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieOverlay overlay = videoProject.getOverlay(mediaItemId, overlayId);
3695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (overlay != null) {
369605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setDuration(durationMs);
3699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.setAppDuration(overlay.getDuration());
3701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3704ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onOverlayDurationSet(projectPath, overlayId, mediaItemId,
3707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            durationMs, ex);
3708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_OVERLAY_SET_ATTRIBUTES: {
3714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3716ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3717ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String overlayId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Bundle userAttributes = intent.getBundleExtra(PARAM_ATTRIBUTES);
3722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MovieOverlay overlay = videoProject.getOverlay(mediaItemId,
3727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                overlayId);
3728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (overlay != null) {
372905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
3730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            overlay.updateUserAttributes(userAttributes);
3731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3732ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3733ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3734ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3735ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3736ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onOverlayUserAttributesSet(projectPath, overlayId, mediaItemId,
3737ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            userAttributes, ex);
3738ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3739ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3743ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_ADD_COLOR:
3744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_ADD_IMAGE_KEN_BURNS:{
3745ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3746ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3747ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3748ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3749ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3750ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3752ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieEffect movieEffect = (MovieEffect)result;
3753ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3754ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.addEffect(mediaItemId, movieEffect);
3757ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3758ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3759ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onEffectAdded(projectPath, movieEffect, mediaItemId, ex);
3762ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3764ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3765ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3767ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_EFFECT_REMOVE: {
3768ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3769ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3770ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3771ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3772ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String mediaItemId = intent.getStringExtra(
3773ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_RELATIVE_STORYBOARD_ITEM_ID);
3774ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String effectId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3775ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3776ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3777ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3778ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3779ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.removeEffect(mediaItemId, effectId);
3780ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3781ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3782ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3783ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3784ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onEffectRemoved(projectPath, effectId, mediaItemId, ex);
3785ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3786ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3787ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3788ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3789ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3790ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_ADD: {
3791ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3792ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3793ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3794ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3795ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieAudioTrack movieAudioTrack = (MovieAudioTrack)result;
3796ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3797ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3798ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.addAudioTrack(movieAudioTrack);
3800ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3801ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3802ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3803ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3804ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onAudioTrackAdded(projectPath, movieAudioTrack, ex);
3805ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3806ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3807ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3808ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3809ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3810ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_REMOVE: {
3811ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3812ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3813ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3814ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3817ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3818ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3819ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3820ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoProject.removeAudioTrack(audioTrackId);
3821ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3822ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3823ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3824ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3825ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onAudioTrackRemoved(projectPath, audioTrackId, ex);
3826ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3827ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3828ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3829ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3830ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3831ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_BOUNDARIES: {
3832ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3833ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3834ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3835ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3836ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3837ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final long beginBoundary = intent.getLongExtra(PARAM_BEGIN_BOUNDARY, 0);
3838ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final long endBoundary = intent.getLongExtra(PARAM_END_BOUNDARY, 0);
3839ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3840ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3841ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3842ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (ex == null) {
3843ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        final MovieAudioTrack audioTrack =
3844ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoProject.getAudioTrack(audioTrackId);
3845ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (audioTrack != null) {
384605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
3847ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.setExtractBoundaries(beginBoundary, endBoundary);
3848ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3849ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3850ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3851ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3852ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
3853ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onAudioTrackBoundariesSet(projectPath, audioTrackId,
3854ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            beginBoundary, endBoundary, ex);
3855ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3856ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3857ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3858ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3859ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3860ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_LOOP: {
3861ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3862ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3863ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3864ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3865ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3866ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3867ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3868ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieAudioTrack audioTrack = videoProject.getAudioTrack(audioTrackId);
3869ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack != null) {
387005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3871ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.enableLoop(intent.getBooleanExtra(PARAM_LOOP, false));
3873ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3874ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.enableAppLoop(audioTrack.isLooping());
3875ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3876ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3877ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3878ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3879ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3880ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3881ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3882ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_DUCK: {
3883ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3884ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3885ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3886ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3887ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3888ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3889ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3890ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieAudioTrack audioTrack = videoProject.getAudioTrack(audioTrackId);
3891ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack != null) {
389205665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3893ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3894ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.enableDucking(intent.getBooleanExtra(PARAM_DUCK, false));
3895ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3896ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.enableAppDucking(audioTrack.isDuckingEnabled());
3897ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3898ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3899ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3900ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3901ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3902ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3903ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3904ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_VOLUME: {
3905ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3906ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3907ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3908ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3909ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3910ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3911ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3912ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieAudioTrack audioTrack = videoProject.getAudioTrack(audioTrackId);
3913ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack != null) {
391405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3915ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3916ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.setVolume(intent.getIntExtra(PARAM_VOLUME, 0));
3917ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3918ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.setAppVolume(audioTrack.getVolume());
3919ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3920ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3921ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3922ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3923ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3924ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3925ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3926ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case OP_AUDIO_TRACK_SET_MUTE: {
3927ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3928ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3929ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3930ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3931ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
3932ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (videoProject != null) {
3933ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3934ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final MovieAudioTrack audioTrack = videoProject.getAudioTrack(audioTrackId);
3935ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack != null) {
393605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                        videoProject.setClean(false);
3937ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (ex == null) {
3938ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.setMute(intent.getBooleanExtra(PARAM_MUTE, false));
3939ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
3940ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            audioTrack.setAppMute(audioTrack.isMuted());
3941ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3942ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
3943ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3944ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3945ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3946ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3947ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
394889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            case OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM_STATUS: {
394989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                if (finalize) {
395089489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    finalizeRequest(intent);
395189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                }
3952ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
395389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
395489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final int progress = intent.getIntExtra(PARAM_PROGRESS_VALUE, 0);
3955ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
395689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
395789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    listener.onAudioTrackExtractAudioWaveformProgress(projectPath, audioTrackId,
395889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            progress);
3959ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3960ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3961ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3962ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3963ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
396489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            case OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM: {
3965ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3966ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3967ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3968ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3969ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String audioTrackId = intent.getStringExtra(PARAM_STORYBOARD_ITEM_ID);
3970ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
397189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final VideoEditorProject videoProject = getProject(projectPath);
397289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                if (ex == null && videoProject != null) {
397389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    if (result != null) {
397489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        final MovieAudioTrack audioTrack =
397589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            videoProject.getAudioTrack(audioTrackId);
397689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        if (audioTrack != null) {
397705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi                            videoProject.setClean(false);
397889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            audioTrack.setWaveformData((WaveformData)result);
3979ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
3980ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
398189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                }
3982ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
398389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                for (ApiServiceListener listener : mListeners) {
398489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                    listener.onAudioTrackExtractAudioWaveformComplete(projectPath,
398589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                            audioTrackId, ex);
3986ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3987ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3988ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3989ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3990ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3991ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
3992ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (finalize) {
3993ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    finalizeRequest(intent);
3994ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
3995ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                break;
3996ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
3997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
3998ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (finalize) {
4000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mIntentPool.put(intent);
4001ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4005d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * Finalizes a request. Calls the listeners that are interested in project status
4006d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * change and stops this service if there are no more pending intents.
4007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4008d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * @param intent The intent that just completed
4009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void finalizeRequest(Intent intent) {
4011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mPendingIntents.remove(intent.getStringExtra(PARAM_REQUEST_ID));
4012ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4013ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final String projectPath = intent.getStringExtra(PARAM_PROJECT_PATH);
4014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (projectPath != null) {
4015fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            final boolean projectEdited = isProjectBeingEdited(projectPath);
4016ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (projectEdited == false) {
4017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (ApiServiceListener listener : mListeners) {
4018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    listener.onProjectEditState(projectPath, projectEdited);
4019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mPendingIntents.size() == 0) {
4024d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            // Cancel the current timer if any. Extend the timeout by 5000 ms.
4025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mHandler.removeCallbacks(mStopRunnable);
4026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Start a timer which will stop the service if the queue of
4028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // pending intent will be empty at that time.
4029ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // This prevents the service from starting & stopping too often.
4030ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mHandler.postDelayed(mStopRunnable, 5000);
4031d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            logd("completeRequest: Stopping service in 5000 ms");
4032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4035ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4036d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * Checks if the current project is the project specified by the specified path.
4037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
4039ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The video editor project
4041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private VideoEditorProject getProject(String projectPath) {
4043ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoProject != null) {
4044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mVideoProject.getPath().equals(projectPath)) {
4045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return mVideoProject;
4046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4049ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
4050ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4051ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Check if the current editor is the project specified by the specified path
4054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
4056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The video editor
4058ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4059ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private synchronized VideoEditor getVideoEditor(String projectPath) {
4060ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoEditor != null) {
4061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mVideoEditor.getPath().equals(projectPath)) {
4062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return mVideoEditor;
4063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
4067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Release the editor
4071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private synchronized void releaseEditor() {
4073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoEditor != null) {
4074d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            logd("releaseEditor (current): " + mVideoEditor.getPath());
4075ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mVideoEditor.release();
4076ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mVideoEditor = null;
4077ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mGeneratePreviewListener = null;
4078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            System.gc();
4080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4082ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4083ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Release the specified editor
4085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4086ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
4087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4088ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private synchronized void releaseEditor(String projectPath) {
4089ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoEditor != null) {
4090ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mVideoEditor.getPath().equals(projectPath)) {
4091d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                logd("releaseEditor: " + projectPath);
4092ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mVideoEditor.release();
4093ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mVideoEditor = null;
4094ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mGeneratePreviewListener = null;
4095ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4096ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                System.gc();
4097ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4098ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4099ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Release the current editor if it is *not* the current editor
4103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param projectPath The project path
4105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The current video editor
4107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private synchronized VideoEditor releaseEditorNot(String projectPath) {
4109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mVideoEditor != null) {
4110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (!mVideoEditor.getPath().equals(projectPath)) {
4111d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                logd("releaseEditorNot: " + mVideoEditor.getPath());
4112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mVideoEditor.release();
4113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mVideoEditor = null;
4114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mGeneratePreviewListener = null;
4115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                System.gc();
4117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return mVideoEditor;
4121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Generate the preview
4125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param updatePreviewFrame true to show preview frame when done
4128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void generatePreview(VideoEditor videoEditor, boolean updatePreviewFrame) {
4130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        try {
4131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            videoEditor.generatePreview(mGeneratePreviewListener);
4132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mGeneratePreviewListener != null) {
4133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // This is the last callback which is always fired last to
4134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // let the UI know that generate preview completed
4135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mGeneratePreviewListener.onProgress(null,
4136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        updatePreviewFrame ? ACTION_UPDATE_FRAME : ACTION_NO_FRAME_UPDATE, 100);
4137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } catch (Exception ex) {
4139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            ex.printStackTrace();
4140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
41442de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng     * Exports a movie in a distinct worker thread.
4145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The intent
4148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void exportMovie(final VideoEditor videoEditor, final Intent intent) {
41502de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng        mExportCancelled = false;
4151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        new Thread() {
4152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            @Override
4153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void run() {
4154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final String filename = intent.getStringExtra(PARAM_FILENAME);
4155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int height = intent.getIntExtra(PARAM_HEIGHT, -1);
4156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int bitrate = intent.getIntExtra(PARAM_BITRATE, -1);
4157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Create the export status Intent
4159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Intent statusIntent = mIntentPool.get();
4160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                statusIntent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_EXPORT_STATUS);
4161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                statusIntent.putExtra(PARAM_PROJECT_PATH, intent.getStringExtra(
4162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        PARAM_PROJECT_PATH));
4163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                statusIntent.putExtra(PARAM_FILENAME, filename);
4164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                statusIntent.putExtra(PARAM_INTENT, intent);
4165378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                Exception resultException = null;
4166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                try {
4168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.export(filename, height, bitrate, new ExportProgressListener() {
4169258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng                        @Override
4170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        public void onProgress(VideoEditor videoEditor, String filename,
4171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                int progress) {
4172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            final Intent progressIntent = mIntentPool.get();
4173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            progressIntent.putExtra(PARAM_OP, OP_VIDEO_EDITOR_EXPORT_STATUS);
4174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            progressIntent.putExtra(PARAM_PROJECT_PATH, intent.getStringExtra(
4175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    PARAM_PROJECT_PATH));
4176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            progressIntent.putExtra(PARAM_FILENAME, filename);
4177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            progressIntent.putExtra(PARAM_INTENT, intent);
4178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            progressIntent.putExtra(PARAM_PROGRESS_VALUE, progress);
4179d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            mVideoThread.submit(progressIntent);
4180d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                            logv("Export progress: " + progress + " for: " + filename);
4181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
4182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    });
4183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4184378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                    statusIntent.putExtra(PARAM_CANCELLED, mExportCancelled);
41852de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                    if (!mExportCancelled) {
41862de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                        if (new File(filename).exists()) {
41872de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                            statusIntent.putExtra(PARAM_MOVIE_URI, exportToGallery(filename));
41882de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                        } else {
4189378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                            resultException = new IllegalStateException("Export file does not exist: " + filename);
41902de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                        }
4191d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        logv("Export complete for: " + filename);
41922de6d0c12af1b3938a2143152330014f4863b472Shih-chia Cheng                    } else {
4193d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                        logv("Export cancelled by user, file name: " + filename);
4194b1fd023531a65d0a15f665fd975791ea1b5f22c3Gil Dobjanschi                    }
4195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } catch (Exception ex) {
4196d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    logv("Export error for: " + filename);
4197d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    ex.printStackTrace();
4198378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                    resultException = ex;
4199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4200378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang
4201378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                // Complete the request
4202378d3c8985dfc1fb3fe99d0fa2b1c1ac22e7c7c9Chih-Chung Chang                statusIntent.putExtra(PARAM_EXCEPTION, resultException);
4203d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mVideoThread.submit(statusIntent);
4204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }.start();
4206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Extract the audio waveform of a media item
4210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The original Intent
421289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi     * @param videoEditor The video editor
4213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItem The media item
4214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
421589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi    private void extractMediaItemAudioWaveform(final Intent intent, final VideoEditor videoEditor,
421689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            final MediaVideoItem mediaItem) throws IOException {
421789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi        mediaItem.extractAudioWaveform(
421889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            new ExtractAudioWaveformProgressListener() {
4219258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng            @Override
422089489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            public void onProgress(int progress) {
422189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final Intent progressIntent = mIntentPool.get();
422289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_OP, OP_MEDIA_ITEM_EXTRACT_AUDIO_WAVEFORM_STATUS);
422389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_PROJECT_PATH,
4224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_PROJECT_PATH));
422589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_INTENT, intent);
422689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_STORYBOARD_ITEM_ID, mediaItem.getId());
422789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_PROGRESS_VALUE, progress);
422889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi
422989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                completeRequest(progressIntent, videoEditor, null, null, null, true);
4230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
423189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi        });
4232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Extract the audio waveform of an AudioTrack
4236ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4237ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param intent The original Intent
423889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi     * @param videoEditor The video editor
4239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrack The audio track
4240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
424189489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi    private void extractAudioTrackAudioWaveform(final Intent intent, final VideoEditor videoEditor,
424289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            final AudioTrack audioTrack) throws IOException {
424389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi        audioTrack.extractAudioWaveform(
424489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            new ExtractAudioWaveformProgressListener() {
4245258481be4734642b144c37f6b6572d8c85263f37Shih-chia Cheng            @Override
424689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi            public void onProgress(int progress) {
424789489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                final Intent progressIntent = mIntentPool.get();
424889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_OP,
424989489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                        OP_AUDIO_TRACK_EXTRACT_AUDIO_WAVEFORM_STATUS);
425089489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_PROJECT_PATH,
4251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        intent.getStringExtra(PARAM_PROJECT_PATH));
425289489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_INTENT, intent);
425389489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_STORYBOARD_ITEM_ID, audioTrack.getId());
425489489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                progressIntent.putExtra(PARAM_PROGRESS_VALUE, progress);
425589489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi
425689489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi                completeRequest(progressIntent, videoEditor, null, null, null, true);
4257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
425889489d519ea60d5ea6d5916beb30814a47efc564Gil Dobjanschi        });
4259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Get the media item following the specified media item
4263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItemId The media item id
4266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The next media item
4267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static MediaItem nextMediaItem(VideoEditor videoEditor, String mediaItemId) {
4269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
4270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mediaItemId == null) {
4271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mediaItems.size() > 0) {
4272ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return mediaItems.get(0);
4273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
4275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int mediaItemCount = mediaItems.size();
4276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < mediaItemCount; i++) {
4277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                MediaItem mi = mediaItems.get(i);
4278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mi.getId().equals(mediaItemId)) {
4279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (i < mediaItemCount - 1) {
4280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        return mediaItems.get(i + 1);
4281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
4282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        break;
4283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
4284ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4285ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
4289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Export the movie to the Gallery
4293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param filename The filename
4295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The video MediaStore URI
4296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private Uri exportToGallery(String filename) {
4298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Save the name and description of a video in a ContentValues map.
4299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final ContentValues values = new ContentValues(2);
4300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
4301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        values.put(MediaStore.Video.Media.DATA, filename);
4302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add a new record (identified by uri)
4303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Uri uri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
4304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                values);
4305d4176d3ce9ca6dd97d2407caba88bae4dca155adGil Dobjanschi        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
4306d4176d3ce9ca6dd97d2407caba88bae4dca155adGil Dobjanschi                Uri.parse("file://"+ filename)));
4307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return uri;
4308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4309ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Apply a theme to the entire movie. This method shall be used when the
4312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * theme is changing.
4313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
4316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void applyThemeToMovie(VideoEditor videoEditor, String themeId) throws IOException {
4318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Context context = getApplicationContext();
4319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieTheme theme = MovieTheme.getTheme(context, themeId);
4320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
4321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the transitions
4323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int mediaItemsCount = mediaItems.size();
4324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mediaItemsCount > 0) {
4325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Remove all the transitions
4326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < mediaItemsCount; i++) {
4327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MediaItem mi = mediaItems.get(i);
4328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (i == 0) {
4329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition beginTransition = mi.getBeginTransition();
4330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (beginTransition != null) {
4331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        videoEditor.removeTransition(beginTransition.getId());
4332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
4333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Transition endTransition = mi.getEndTransition();
4336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (endTransition != null) {
4337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.removeTransition(endTransition.getId());
4338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the begin transition to the first media item
4342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition beginMovieTransition = theme.getBeginTransition();
4343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (beginMovieTransition != null) {
4344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MediaItem firstMediaItem = mediaItems.get(0);
4345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(
4346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        beginMovieTransition.buildTransition(context, null, firstMediaItem));
4347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the mid transitions
4350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition midMovieTransition = theme.getMidTransition();
4351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (midMovieTransition != null) {
4352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (int i = 0; i < mediaItemsCount - 1; i++) {
4353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(
4354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            midMovieTransition.buildTransition(context,
4355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mediaItems.get(i), mediaItems.get(i + 1)));
4356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the end transition to the last media item
4360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition endMovieTransition = theme.getEndTransition();
4361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (endMovieTransition != null) {
4362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MediaItem lastMediaItem = mediaItems.get(mediaItemsCount - 1);
4363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(
4364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        endMovieTransition.buildTransition(context, lastMediaItem, null));
4365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the overlay
4369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieOverlay movieOverlay = theme.getOverlay();
4370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (movieOverlay != null && mediaItemsCount > 0) {
4371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Remove all the overlay for the first media item
4372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MediaItem mediaItem = mediaItems.get(0);
4373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final List<Overlay> overlays = mediaItem.getAllOverlays();
4374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (overlays.size() > 0) {
4375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mediaItem.removeOverlay(overlays.get(0).getId());
4376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the new overlay
4379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int scaledWidth, scaledHeight;
4380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mediaItem instanceof MediaVideoItem) {
4381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                scaledWidth = ((MediaVideoItem)mediaItem).getWidth();
4382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                scaledHeight = ((MediaVideoItem)mediaItem).getHeight();
4383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
4384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                scaledWidth = ((MediaImageItem)mediaItem).getScaledWidth();
4385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                scaledHeight = ((MediaImageItem)mediaItem).getScaledHeight();
4386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final Overlay overlay = new OverlayFrame(mediaItem, generateId(),
4389194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                    ImageUtils.buildOverlayBitmap(getApplicationContext(), null,
4390194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                            movieOverlay.getType(), movieOverlay.getTitle(),
4391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            movieOverlay.getSubtitle(), scaledWidth, scaledHeight),
4392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            movieOverlay.getStartTime(), movieOverlay.getDuration());
4393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Set the user attributes
4395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final Bundle userAttributes = movieOverlay.buildUserAttributes();
4396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (String name : userAttributes.keySet()) {
4397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (MovieOverlay.getAttributeType(name).equals(Integer.class)) {
4398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    overlay.setUserAttribute(name,
4399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            Integer.toString(userAttributes.getInt(name)));
4400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else { // Strings
4401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    overlay.setUserAttribute(name, userAttributes.getString(name));
4402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mediaItem.addOverlay(overlay);
4405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieAudioTrack at = theme.getAudioTrack();
4408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (at != null) {
4409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Remove all audio tracks
4410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final List<AudioTrack> audioTracks = videoEditor.getAllAudioTracks();
4411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            while (audioTracks.size() > 0) {
4412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.removeAudioTrack(audioTracks.get(0).getId());
4413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the new audio track
4416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final AudioTrack audioTrack = new AudioTrack(videoEditor, generateId(),
4417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    FileUtils.getAudioTrackFilename(context, at.getRawResourceId()));
4418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Enable looping if necessary
4420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (at.isLooping()) {
4421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                audioTrack.enableLoop();
4422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Enable ducking
4425516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi            audioTrack.enableDucking(DUCK_THRESHOLD, DUCK_TRACK_VOLUME);
4426516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi            audioTrack.setVolume(DEFAULT_AUDIO_TRACK_VOLUME);
4427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            videoEditor.addAudioTrack(audioTrack);
4428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Apply a theme
4433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
4436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItem The mediaItem
4437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void applyThemeToMediaItem(VideoEditor videoEditor, String themeId,
4439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            MediaItem mediaItem) throws IOException {
4440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
4441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int mediaItemsCount = mediaItems.size();
4442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mediaItemsCount == 0) {
4443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
4444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4445ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // We would only add transitions if the transitions don't exist
4447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Transition beginTransition = mediaItem.getBeginTransition();
4448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Transition endTransition = mediaItem.getEndTransition();
4449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Context context = getApplicationContext();
4451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieTheme theme = MovieTheme.getTheme(context, themeId);
4452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MediaItem firstMediaItem = mediaItems.get(0);
4454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (beginTransition == null) {
4455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the begin transition
4456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition beginMovieTransition = theme.getBeginTransition();
4457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (beginMovieTransition != null) {
4458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (firstMediaItem == mediaItem) {
4459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(
4460ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            beginMovieTransition.buildTransition(context, null, mediaItem));
4461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4464ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the mid transitions
4466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieTransition midMovieTransition = theme.getMidTransition();
4467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (midMovieTransition != null) {
4468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < mediaItemsCount; i++) {
4469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MediaItem mi = mediaItems.get(i);
4470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mi == mediaItem) {
4471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (i > 0) { // Not the first one
4472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (beginTransition == null) {
4473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            // Add transition before this media item
4474ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.addTransition(midMovieTransition.buildTransition(context,
4475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mediaItems.get(i - 1), mi));
4476ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
4477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
4478ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4479ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (i < mediaItemsCount - 1) { // Not the last one
4480ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (endTransition == null) {
4481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            // Add the transition after this media item
4482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            videoEditor.addTransition(midMovieTransition.buildTransition(context,
4483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                        mi, mediaItems.get(i + 1)));
4484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
4485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
4486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
4487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (endTransition == null) {
4492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Add the end transition to the last media item
4493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition endMovieTransition = theme.getEndTransition();
4494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MediaItem lastMediaItem = mediaItems.get(mediaItemsCount - 1);
4495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (endMovieTransition != null && lastMediaItem == mediaItem) {
4496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(
4497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        endMovieTransition.buildTransition(context, lastMediaItem, null));
4498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the overlay
4502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieOverlay movieOverlay = theme.getOverlay();
4503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (movieOverlay != null) {
4504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (firstMediaItem == mediaItem) {
4505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Remove the overlay
4506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final List<Overlay> overlays = mediaItem.getAllOverlays();
4507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (overlays.size() > 0) {
4508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    mediaItem.removeOverlay(overlays.get(0).getId());
4509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Add the new overlay
4512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final int scaledWidth, scaledHeight;
4513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mediaItem instanceof MediaVideoItem) {
4514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    scaledWidth = ((MediaVideoItem)mediaItem).getWidth();
4515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    scaledHeight = ((MediaVideoItem)mediaItem).getHeight();
4516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else {
4517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    scaledWidth = ((MediaImageItem)mediaItem).getScaledWidth();
4518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    scaledHeight = ((MediaImageItem)mediaItem).getScaledHeight();
4519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Overlay overlay = new OverlayFrame(mediaItem, generateId(),
4522194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                        ImageUtils.buildOverlayBitmap(getApplicationContext(), null,
4523194f8240bb71889b6a096eecda5601c969f6c21fGil Dobjanschi                                movieOverlay.getType(), movieOverlay.getTitle(),
4524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                movieOverlay.getSubtitle(), scaledWidth, scaledHeight),
4525ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        movieOverlay.getStartTime(),
4526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        Math.min(movieOverlay.getDuration(),
4527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                mediaItem.getDuration() - movieOverlay.getStartTime()));
4528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4529ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                // Set the user attributes
4530ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Bundle userAttributes = movieOverlay.buildUserAttributes();
4531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                for (String name : userAttributes.keySet()) {
4532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (MovieOverlay.getAttributeType(name).equals(Integer.class)) {
4533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        overlay.setUserAttribute(name,
4534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                Integer.toString(userAttributes.getInt(name)));
4535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else { // Strings
4536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        overlay.setUserAttribute(name, userAttributes.getString(name));
4537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
4538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mediaItem.addOverlay(overlay);
4540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Apply theme transitions after an item was removed
4546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
4549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param removedItemPosition The position of the removed item
4550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param beginTransition The removed item begin transition
4551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endTransition The removed item end transition
4552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The transition that was added
4554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private Transition applyThemeAfterRemove(VideoEditor videoEditor, String themeId,
4556ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int removedItemPosition, Transition beginTransition,
4557ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Transition endTransition) throws IOException {
4558ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
4559ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int mediaItemCount = mediaItems.size();
4560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mediaItemCount == 0) {
4561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return null;
4562ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4563ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4564ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Context context = getApplicationContext();
4565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieTheme theme = MovieTheme.getTheme(context, themeId);
4566ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4567ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        Transition transition = null;
4568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (removedItemPosition == 0) { // First item removed
4569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (theme.getBeginTransition() != null && beginTransition != null) {
4570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                transition =
4571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    theme.getBeginTransition().buildTransition(context, null, mediaItems.get(0));
4572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(transition);
4573ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else if (removedItemPosition == mediaItemCount) { // Last item removed
4575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (theme.getEndTransition() != null && endTransition != null) {
4576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                transition = theme.getEndTransition().buildTransition(context,
4577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItems.get(mediaItemCount - 1), null);
4578ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(transition);
4579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else { // Mid item removed
4581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (theme.getMidTransition() != null && beginTransition != null) {
4582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                transition =
4583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    theme.getMidTransition().buildTransition(context,
4584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItems.get(removedItemPosition - 1),
4585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItems.get(removedItemPosition));
4586ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(transition);
4587ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return transition;
4591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Apply theme transitions after an item was moved
4595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param videoEditor The video editor
4597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param themeId The theme id
4598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param movedMediaItem The moved media item
4599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param originalItemPosition The original media item position
4600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param beginTransition The moved item begin transition
4601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param endTransition The moved item end transition
4602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void applyThemeAfterMove(VideoEditor videoEditor, String themeId,
4604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            MediaItem movedMediaItem, int originalItemPosition, Transition beginTransition,
4605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Transition endTransition) throws IOException {
4606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MediaItem> mediaItems = videoEditor.getAllMediaItems();
4607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int mediaItemCount = mediaItems.size();
4608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mediaItemCount == 0) {
4609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
4610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Context context = getApplicationContext();
4613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieTheme theme = MovieTheme.getTheme(context, themeId);
4614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4615ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (originalItemPosition == 0) { // First item moved
4616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (theme.getBeginTransition() != null && beginTransition != null) {
4617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Transition transition =
4618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    theme.getBeginTransition().buildTransition(context, null, mediaItems.get(0));
4619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(transition);
4620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else if (originalItemPosition == mediaItemCount - 1) { // Last item moved
4622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (theme.getEndTransition() != null && endTransition != null) {
4623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Transition transition = theme.getEndTransition().buildTransition(context,
4624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItems.get(mediaItemCount - 1), null);
4625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                videoEditor.addTransition(transition);
4626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else { // Mid item moved
4628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int newPosition = mediaItems.indexOf(movedMediaItem);
4629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (newPosition > originalItemPosition) { // Moved forward
4630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (endTransition != null && theme.getMidTransition() != null) {
4631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = theme.getMidTransition().buildTransition(
4632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            context, mediaItems.get(originalItemPosition - 1),
4633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            mediaItems.get(originalItemPosition));
4634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
4635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else { // Moved backward
4637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (beginTransition != null && theme.getMidTransition() != null) {
4638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Transition transition = theme.getMidTransition().buildTransition(
4639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            context, mediaItems.get(originalItemPosition),
4640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                mediaItems.get(originalItemPosition + 1));
4641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    videoEditor.addTransition(transition);
4642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Apply the theme at the new position
4647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        applyThemeToMediaItem(videoEditor, themeId, movedMediaItem);
4648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Copy the media items
4652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param mediaItems The media items
4654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The list of media items
4656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private List<MovieMediaItem> copyMediaItems(List<MediaItem> mediaItems) {
4658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MovieMediaItem> movieMediaItems
4659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            = new ArrayList<MovieMediaItem>(mediaItems.size());
4660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        MovieMediaItem prevMediaItem = null;
4661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (MediaItem mediaItem : mediaItems) {
4662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieTransition prevTransition;
4663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (prevMediaItem != null) {
4664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                prevTransition = prevMediaItem.getEndTransition();
4665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else if (mediaItem.getBeginTransition() != null) {
4666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                prevTransition = new MovieTransition(mediaItem.getBeginTransition());
4667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
4668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                prevTransition = null;
4669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieMediaItem movieMediaItem = new MovieMediaItem(mediaItem, prevTransition);
4672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            movieMediaItems.add(movieMediaItem);
4673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            prevMediaItem = movieMediaItem;
4674ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return movieMediaItems;
4677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4678ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Copy the audio tracks
4681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTracks The audio tracks
4683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
4684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The list of audio tracks
4685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private List<MovieAudioTrack> copyAudioTracks(List<AudioTrack> audioTracks) {
4687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final List<MovieAudioTrack> movieAudioTracks
4688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            = new ArrayList<MovieAudioTrack>(audioTracks.size());
4689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (AudioTrack audioTrack : audioTracks) {
4690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            movieAudioTracks.add(new MovieAudioTrack(audioTrack));
4691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return movieAudioTracks;
4693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4695d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private static void logd(String message) {
4696d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        if (Log.isLoggable(TAG, Log.DEBUG)) {
4697d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            Log.d(TAG, message);
4698d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        }
4699d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    }
4700d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng
4701d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private static void logv(String message) {
4702d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        if (Log.isLoggable(TAG, Log.VERBOSE)) {
4703d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            Log.v(TAG, message);
4704d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        }
4705d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    }
4706d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng
4707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
4708d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng     * Worker thread that processes intents and maintains its own intent queue.
4709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
4710d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng    private class IntentProcessor extends Thread {
4711d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        private final BlockingQueue<Intent> mIntentQueue;
4712d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng
4713d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        public IntentProcessor(String threadName) {
4714d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            super("IntentProcessor-" + threadName);
4715d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            mIntentQueue = new LinkedBlockingQueue<Intent>();
4716d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        }
4717d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng
4718d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        @Override
4719d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        public void run() {
4720d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            try {
4721d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                while(true) {
4722d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                    processIntent(mIntentQueue.take());
4723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
4724d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            } catch (InterruptedException e) {
4725d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                Log.e(TAG, "Terminating " + getName());
4726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
4730d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng         * Submits a new intent for processing.
4731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
4732d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng         * @param intent The intent to be processed
4733ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
4734d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        public void submit(Intent intent) {
4735d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            if (isAlive()) {
4736d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mIntentQueue.add(intent);
4737d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            } else {
4738d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                Log.e(TAG, getName() + " should be started before submitting tasks.");
4739ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
4743d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng         * Removes an intent from the queue.
4744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
4745d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng         * @param intent The intent to be removed
4746ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
4747d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng         * @return true if the intent is removed
4748ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
4749d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        public boolean cancel(Intent intent) {
4750d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            return mIntentQueue.remove(intent);
4751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4752ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4753d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng        public Iterator<Intent> getIntentQueueIterator() {
4754d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            return mIntentQueue.iterator();
4755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
4757ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void quit() {
4758d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            // Display an error if the queue is not empty and clear it.
4759d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            final int queueSize = mIntentQueue.size();
4760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (queueSize > 0) {
4761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                Log.e(TAG, "Thread queue is not empty. Size: " + queueSize);
4762d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng                mIntentQueue.clear();
4763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
4764d7de985f8b36318a4ff49400753bf3bb5f9b9faeShih-chia Cheng            interrupt();
4765ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
4766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
4767ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi}
4768