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