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