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