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