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.widgets; 18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport java.util.List; 20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 21ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.Activity; 22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.AlertDialog; 23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.Dialog; 243cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschiimport android.content.ClipData; 25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context; 26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.DialogInterface; 27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Intent; 28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Bitmap; 29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.graphics.Rect; 30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.EffectColor; 31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaItem; 32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.Transition; 33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.TransitionSliding; 34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Bundle; 35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Handler; 36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.AttributeSet; 37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Log; 38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.ActionMode; 39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.Display; 40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.DragEvent; 41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.Menu; 42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.MenuItem; 43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.MotionEvent; 44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.View; 4548fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschiimport android.widget.ImageButton; 46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.LinearLayout; 47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.RelativeLayout; 48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.Toast; 49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 5081393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.AlertDialogs; 5181393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.EffectType; 52fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Chengimport com.android.videoeditor.KenBurnsActivity; 53fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Chengimport com.android.videoeditor.OverlayTitleEditor; 5481393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.TransitionType; 5581393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.TransitionsActivity; 5681393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.VideoEditorActivity; 5781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.ApiService; 5881393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.MovieEffect; 5981393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.MovieMediaItem; 60fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Chengimport com.android.videoeditor.service.MovieOverlay; 6181393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.MovieTransition; 6281393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.VideoEditorProject; 6381393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.FileUtils; 6481393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.MediaItemUtils; 6581393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.R; 66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/** 68fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * LinearLayout which holds media items and transitions. 69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class MediaLinearLayout extends LinearLayout { 71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Logging 72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final String TAG = "MediaLinearLayout"; 73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Dialog parameter ids 75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final String PARAM_DIALOG_MEDIA_ITEM_ID = "media_item_id"; 76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final String PARAM_DIALOG_CURRENT_RENDERING_MODE = "rendering_mode"; 77ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final String PARAM_DIALOG_TRANSITION_ID = "transition_id"; 78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Transition duration limits 80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final long MAXIMUM_IMAGE_DURATION = 6000; 81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final long MAXIMUM_TRANSITION_DURATION = 3000; 82560aaeaad2fe997d276b67c271f6d86f46db426dGil Dobjanschi private static final long MINIMUM_TRANSITION_DURATION = 250; 83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static final long TIME_TOLERANCE = 30; 85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Instance variables 87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final ItemSimpleGestureListener mMediaItemGestureListener; 88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final ItemSimpleGestureListener mTransitionGestureListener; 89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final Handler mHandler; 90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final int mHalfParentWidth; 91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final int mHandleWidth; 92e1b5a338441f15cfa506d1acd08e7e65095ee171Gil Dobjanschi private final int mTransitionVerticalInset; 9305caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi private final ImageButton mLeftAddClipButton, mRightAddClipButton; 94fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng private MediaLinearLayoutListener mListener; 95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private ActionMode mMediaItemActionMode; 96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private ActionMode mTransitionActionMode; 97ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private VideoEditorProject mProject; 98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private boolean mPlaybackInProgress; 99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private HandleView mLeftHandle, mRightHandle; 1001910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng private boolean mIsTrimming; // Indicates if some media item is being trimmed. 101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private boolean mMoveLayoutPending; 10224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private View mScrollView; // Convenient handle to the parent scroll view. 103c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi private View mSelectedView; 1043cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi private String mDragMediaItemId; 105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private float mPrevDragPosition; 106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mPrevDragScrollTime; 1073cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi private MovieMediaItem mDropAfterMediaItem; 1083cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi private int mDropIndex; 1098401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi private boolean mFirstEntered; 110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 112fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * The media item action mode handler. 113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private class MediaItemActionModeCallback implements ActionMode.Callback { 115fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Media item associated with this callback. 116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final MovieMediaItem mMediaItem; 117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public MediaItemActionModeCallback(MovieMediaItem mediaItem) { 119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem = mediaItem; 120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 122fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onCreateActionMode(ActionMode mode, Menu menu) { 124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode = mode; 125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 126fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Activity activity = (Activity) getContext(); 127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getMenuInflater().inflate(R.menu.media_item_mode_menu, menu); 128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 132fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 134fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final boolean enable = !ApiService.isProjectBeingEdited(mProject.getPath()) && 13505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi !mPlaybackInProgress; 13605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 137fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Pan zoom effect is only for images. Hide it from video clips. 138fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng MenuItem item; 139fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (!mMediaItem.isImage()) { 140fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_pan_zoom_effect); 141fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item.setVisible(false); 142fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item.setEnabled(false); 143fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 144fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 145fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // If the selected media item already has an effect applied on it, check the 146fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // corresponding effect menu item. 147fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng MovieEffect effect = mMediaItem.getEffect(); 148fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (effect != null) { 149fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng switch (mMediaItem.getEffect().getType()) { 150fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case EffectType.EFFECT_KEN_BURNS: 151fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_pan_zoom_effect); 152fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 153fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case EffectType.EFFECT_COLOR_GRADIENT: 154fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_gradient_effect); 155fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 156fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case EffectType.EFFECT_COLOR_SEPIA: 157fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_sepia_effect); 158fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 159fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case EffectType.EFFECT_COLOR_NEGATIVE: 160fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_negative_effect); 161fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 162fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng default: 163fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_no_effect); 164fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 165fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 166fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } else { 167fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item = menu.findItem(R.id.action_no_effect); 168fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 169fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng item.setChecked(true); 170fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng menu.findItem(R.id.media_item_effect_menu).setEnabled(enable); 17105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 172fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Menu item for adding a new overlay. It is also used to edit 173fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // existing overlay. We change the displayed text accordingly. 17405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem aomi = menu.findItem(R.id.action_add_overlay); 175fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng aomi.setTitle((mMediaItem.getOverlay() == null) ? 176fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng R.string.editor_add_overlay : R.string.editor_edit_overlay); 17705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi aomi.setEnabled(enable); 17805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 179fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final MenuItem romi = menu.findItem(R.id.action_remove_overlay); 180fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng romi.setVisible(mMediaItem.getOverlay() != null); 18173abe7b77925cc7358aecd7626667539ff0ffb5aShih-chia Cheng romi.setEnabled(enable && mMediaItem.getOverlay() != null); 182fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 18305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem btmi = menu.findItem(R.id.action_add_begin_transition); 18405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi btmi.setVisible(mMediaItem.getBeginTransition() == null); 18573abe7b77925cc7358aecd7626667539ff0ffb5aShih-chia Cheng btmi.setEnabled(enable && mMediaItem.getBeginTransition() == null); 18605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 18705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem etmi = menu.findItem(R.id.action_add_end_transition); 18805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi etmi.setVisible(mMediaItem.getEndTransition() == null); 18973abe7b77925cc7358aecd7626667539ff0ffb5aShih-chia Cheng etmi.setEnabled(enable && mMediaItem.getEndTransition() == null); 19005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 19105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem rmmi = menu.findItem(R.id.action_rendering_mode); 19205665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi rmmi.setVisible(mProject.hasMultipleAspectRatios()); 19373abe7b77925cc7358aecd7626667539ff0ffb5aShih-chia Cheng rmmi.setEnabled(enable && mProject.hasMultipleAspectRatios()); 194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 198fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (item.getItemId()) { 201fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_add_overlay: { 202fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng editOverlay(mMediaItem); 203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 206fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_remove_overlay: { 207fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng removeOverlay(mMediaItem); 208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_add_begin_transition: { 212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem prevMediaItem = mProject.getPreviousMediaItem( 213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getId()); 214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi pickTransition(prevMediaItem); 215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_add_end_transition: { 219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi pickTransition(mMediaItem); 220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 223fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_gradient_effect: 224fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_sepia_effect: 225fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_negative_effect: 226fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_pan_zoom_effect: { 227fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng applyEffect(item); 228fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 229fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 230fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 231fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_no_effect: { 232fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (!item.isChecked()) { 233fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Bundle bundle = new Bundle(); 234fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng bundle.putString(PARAM_DIALOG_MEDIA_ITEM_ID, mMediaItem.getId()); 235fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).showDialog( 236fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng VideoEditorActivity.DIALOG_REMOVE_EFFECT_ID, bundle); 237fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 238fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 239fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 240fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_rendering_mode: { 242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Bundle bundle = new Bundle(); 243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.putString(PARAM_DIALOG_MEDIA_ITEM_ID, mMediaItem.getId()); 244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.putInt(PARAM_DIALOG_CURRENT_RENDERING_MODE, 245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppRenderingMode()); 246fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).showDialog( 247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi VideoEditorActivity.DIALOG_CHANGE_RENDERING_MODE_ID, bundle); 248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_delete_media_item: { 252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Bundle bundle = new Bundle(); 253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.putString(PARAM_DIALOG_MEDIA_ITEM_ID, mMediaItem.getId()); 254fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).showDialog( 255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi VideoEditorActivity.DIALOG_REMOVE_MEDIA_ITEM_ID, bundle); 256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 267fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onDestroyActionMode(ActionMode mode) { 269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View mediaItemView = getMediaItemView(mMediaItem.getId()); 270c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi if (mSelectedView != null) { 271c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mLeftHandle.endMove(); 272c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mRightHandle.endMove(); 273c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi } 2741910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng unSelect(mediaItemView); 27570d4786c979a334adff2ef503288efa7e9eb2548Gil Dobjanschi showAddMediaItemButtons(true); 2761910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mMediaItemActionMode = null; 277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 278fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 279fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng private void applyEffect(MenuItem clickedItem) { 280fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (!clickedItem.isChecked()) { 281fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng switch(clickedItem.getItemId()) { 282fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_gradient_effect: 283fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng addEffect(EffectType.EFFECT_COLOR_GRADIENT, 284fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng mMediaItem.getId(), null, null); 285fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng clickedItem.setChecked(true); 286fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 287fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_sepia_effect: 288fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng addEffect(EffectType.EFFECT_COLOR_SEPIA, 289fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng mMediaItem.getId(), null, null); 290fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng clickedItem.setChecked(true); 291fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 292fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_negative_effect: 293fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng addEffect(EffectType.EFFECT_COLOR_NEGATIVE, 294fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng mMediaItem.getId(), null, null); 295fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng clickedItem.setChecked(true); 296fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 297fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng case R.id.action_pan_zoom_effect: { 298fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Note that we don't check the pan zoom checkbox here. 299fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Because pan zoom effect will start a new activity and users 300fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // could cancel applying the effect. Once pan zoom effect has 301fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // really been applied. The action mode will be invalidated in 302fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // onActivityResult() method and the checkbox is then checked. 303fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Intent intent = new Intent(getContext(), KenBurnsActivity.class); 304fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(KenBurnsActivity.PARAM_MEDIA_ITEM_ID, mMediaItem.getId()); 305fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(KenBurnsActivity.PARAM_FILENAME, mMediaItem.getFilename()); 306fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(KenBurnsActivity.PARAM_WIDTH, mMediaItem.getWidth()); 307fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(KenBurnsActivity.PARAM_HEIGHT, mMediaItem.getHeight()); 308fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).startActivityForResult(intent, 309fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng VideoEditorActivity.REQUEST_CODE_KEN_BURNS); 310fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 311fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 312fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng default: 313fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng break; 314fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 315fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 316fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 320fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * The transition action mode handler. 321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private class TransitionActionModeCallback implements ActionMode.Callback { 323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private final MovieTransition mTransition; 324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public TransitionActionModeCallback(MovieTransition transition) { 326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mTransition = transition; 327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 329fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onCreateActionMode(ActionMode mode, Menu menu) { 331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mTransitionActionMode = mode; 332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 333fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Activity activity = (Activity) getContext(); 334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getMenuInflater().inflate(R.menu.transition_mode_menu, menu); 335560aaeaad2fe997d276b67c271f6d86f46db426dGil Dobjanschi mode.setTitle(activity.getString(R.string.editor_transition_title)); 336560aaeaad2fe997d276b67c271f6d86f46db426dGil Dobjanschi 337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 340fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 342fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final boolean enable = !ApiService.isProjectBeingEdited(mProject.getPath()) && 34305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi !mPlaybackInProgress; 34405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 34505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem etmi = menu.findItem(R.id.action_change_transition); 34605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi etmi.setEnabled(enable); 34705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 34805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi final MenuItem rtmi = menu.findItem(R.id.action_remove_transition); 34905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi rtmi.setEnabled(enable); 35005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 354fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (item.getItemId()) { 357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_remove_transition: { 358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Bundle bundle = new Bundle(); 359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.putString(PARAM_DIALOG_TRANSITION_ID, mTransition.getId()); 360fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).showDialog( 361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi VideoEditorActivity.DIALOG_REMOVE_TRANSITION_ID, bundle); 362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case R.id.action_change_transition: { 366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi editTransition(mTransition); 367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 378fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onDestroyActionMode(ActionMode mode) { 380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View transitionView = getTransitionView(mTransition.getId()); 3811910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng unSelect(transitionView); 38270d4786c979a334adff2ef503288efa7e9eb2548Gil Dobjanschi showAddMediaItemButtons(true); 3831910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mTransitionActionMode = null; 384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public MediaLinearLayout(Context context, AttributeSet attrs, int defStyle) { 388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi super(context, attrs, defStyle); 389ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemGestureListener = new ItemSimpleGestureListener() { 391fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onSingleTapConfirmed(View view, int area, MotionEvent e) { 393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mPlaybackInProgress) { 394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (area) { 398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case ItemSimpleGestureListener.LEFT_AREA: { 399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view.isSelected()) { 40024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieMediaItem mediaItem = (MovieMediaItem) view.getTag(); 401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem prevMediaItem = mProject.getPreviousMediaItem( 402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getId()); 403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi pickTransition(prevMediaItem); 404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case ItemSimpleGestureListener.CENTER_AREA: { 409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case ItemSimpleGestureListener.RIGHT_AREA: { 413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view.isSelected()) { 41424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng pickTransition((MovieMediaItem) view.getTag()); 415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 41924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng select(view); 420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 424fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onLongPress(View view, MotionEvent e) { 426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mPlaybackInProgress) { 427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = (MovieMediaItem)view.getTag(); 431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mProject.getMediaItemCount() > 1) { 4328401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi view.startDrag(ClipData.newPlainText("File", mediaItem.getFilename()), 4338401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi ((MediaItemView)view).getShadowBuilder(), mediaItem.getId(), 0); 434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 4353cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 43624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng select(view); 437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode == null) { 439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi startActionMode(new MediaItemActionModeCallback(mediaItem)); 440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }; 443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mTransitionGestureListener = new ItemSimpleGestureListener() { 445fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onSingleTapConfirmed(View view, int area, MotionEvent e) { 447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mPlaybackInProgress) { 448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 45024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng select(view); 451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 454fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onLongPress(View view, MotionEvent e) { 456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mPlaybackInProgress) { 457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 46024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng select(view); 461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mTransitionActionMode == null) { 463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi startActionMode(new TransitionActionModeCallback( 46424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng (MovieTransition) view.getTag())); 465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }; 468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Add the beginning timeline item 47048fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi final View beginView = inflate(getContext(), R.layout.empty_left_timeline_item, null); 471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi beginView.setOnClickListener(new View.OnClickListener() { 472fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(View view) { 47424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 47548fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi } 47648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi }); 47748fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi 47824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mLeftAddClipButton = (ImageButton) beginView.findViewById( 47948fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi R.id.add_left_media_item_button); 48005caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi mLeftAddClipButton.setVisibility(View.GONE); 48105caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi mLeftAddClipButton.setOnClickListener(new View.OnClickListener() { 482fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 48348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi public void onClick(View view) { 484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mProject != null && mProject.getMediaItemCount() > 0) { 48524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 48624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Add a clip at the beginning of the movie. 487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onAddMediaItem(null); 488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(beginView); 492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Add the end timeline item 49448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi final View endView = inflate(getContext(), R.layout.empty_right_timeline_item, null); 495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi endView.setOnClickListener(new View.OnClickListener() { 496fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(View view) { 49824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 49948fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi } 50048fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi }); 50148fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi 502fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng mRightAddClipButton = (ImageButton) endView.findViewById( 50348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi R.id.add_right_media_item_button); 50405caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi mRightAddClipButton.setOnClickListener(new View.OnClickListener() { 505fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 50648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi public void onClick(View view) { 507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mProject != null) { 50824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 50924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Add a clip at the end of the movie. 510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem lastMediaItem = mProject.getLastMediaItem(); 511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (lastMediaItem != null) { 512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onAddMediaItem(lastMediaItem.getId()); 513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onAddMediaItem(null); 515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(endView); 520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle = (HandleView)inflate(getContext(), R.layout.left_handle_view, null); 522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(mLeftHandle); 523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle = (HandleView)inflate(getContext(), R.layout.right_handle_view, null); 525ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(mRightHandle); 526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 52724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mHandleWidth = (int) context.getResources().getDimension(R.dimen.handle_width); 528e1b5a338441f15cfa506d1acd08e7e65095ee171Gil Dobjanschi 52924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mTransitionVerticalInset = (int) context.getResources().getDimension( 530e1b5a338441f15cfa506d1acd08e7e65095ee171Gil Dobjanschi R.dimen.timelime_transition_vertical_inset); 531e1b5a338441f15cfa506d1acd08e7e65095ee171Gil Dobjanschi 53224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Compute half the width of the screen (and therefore the parent view). 53324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final Display display = ((Activity) context).getWindowManager().getDefaultDisplay(); 534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHalfParentWidth = display.getWidth() / 2; 535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler = new Handler(); 537638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi 538638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi setMotionEventSplittingEnabled(false); 539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public MediaLinearLayout(Context context, AttributeSet attrs) { 542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi this(context, attrs, 0); 543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public MediaLinearLayout(Context context) { 546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi this(context, null, 0); 547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 54924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng public void setParentTimelineScrollView(View scrollView) { 55024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView = scrollView; 55124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 55224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 554fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Called when the containing activity is resumed. 55543006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi */ 55643006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi public void onResume() { 557fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Invalidate all progress in case the transition generation or 558fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Ken Burns effect completed while the activity was being paused. 55943006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi final int childrenCount = getChildCount(); 56043006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi for (int i = 0; i < childrenCount; i++) { 56143006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi final View childView = getChildAt(i); 562fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Object item = childView.getTag(); 563fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (item != null) { 564fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (item instanceof MovieMediaItem) { 56524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((MediaItemView) childView).resetGeneratingEffectProgress(); 566fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } else if (item instanceof MovieTransition) { 56724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((TransitionView) childView).resetGeneratingTransitionProgress(); 56843006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi } 56943006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi } 57043006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi } 57143006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi } 57243006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi 573fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng public void setListener(MediaLinearLayoutListener listener) { 574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener = listener; 575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void setProject(VideoEditorProject project) { 57824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng closeActionBars(); 57924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng clearAndHideTrimHandles(); 58024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng removeAllMediaItemAndTransitionViews(); 581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject = project; 583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 586fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * @param inProgress {@code true} if playback is in progress, false otherwise 587ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void setPlaybackInProgress(boolean inProgress) { 589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mPlaybackInProgress = inProgress; 590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi setPlaybackState(inProgress); 591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Don't allow the user to interact with media items or 59224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // transitions while the playback is in progress. 59324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng closeActionBars(); 594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 597251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng * Returns selected view's position on the timeline; -1 if none. 598251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng */ 599251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng public int getSelectedViewPos() { 600251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng return indexOfChild(mSelectedView); 601251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng } 602251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng 603251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng /** 604251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng * Selects the view at the specified position; null if it does not exist. 605251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng */ 606251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng public void setSelectedView(int pos) { 607251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng if (pos < 0) { 608251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng return; 609251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng } 610251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng mSelectedView = getChildAt(pos); 611251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng if (mSelectedView != null) { 612251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng select(mSelectedView); 613251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng } 614251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng } 615251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng 616251fd23edd96d1ccc12e47f2d3ffa6fd530c2cd0Shih-chia Cheng /** 61724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Clears existing media or transition items and adds all given media items. 618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItems The list of media items 620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void addMediaItems(List<MovieMediaItem> mediaItems) { 62224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng closeActionBars(); 62324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng removeAllMediaItemAndTransitionViews(); 624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (MovieMediaItem mediaItem : mediaItems) { 626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addMediaItem(mediaItem); 627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 631fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Adds a new media item at the end of the timeline. 632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItem The media item 634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private void addMediaItem(MovieMediaItem mediaItem) { 636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View mediaItemView = inflate(getContext(), R.layout.media_item, null); 63724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((MediaItemView) mediaItemView).setGestureListener(mMediaItemGestureListener); 63824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((MediaItemView) mediaItemView).setProjectPath(mProject.getPath()); 639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItemView.setTag(mediaItem); 640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Add the new view 642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 643fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng LinearLayout.LayoutParams.WRAP_CONTENT, 644fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng LinearLayout.LayoutParams.FILL_PARENT); 645fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Add the view before the end view, left handle and right handle views. 646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(mediaItemView, getChildCount() - 3, lp); 647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 648fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // If the new media item has beginning and end transitions, add them. 649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition beginTransition = mediaItem.getBeginTransition(); 650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (beginTransition != null) { 651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int cc = getChildCount(); 652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Account for the beginning and end views and the trim handles 653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (cc > 5) { // There is a previous view (transition or media item) 654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View view = getChildAt(cc - 5); 655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = view.getTag(); 656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Do not add transition if it already exists 657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem prevMediaItem = (MovieMediaItem)tag; 659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(beginTransition, prevMediaItem.getId()); 660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // This is the first media item 662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(beginTransition, null); 663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition endTransition = mediaItem.getEndTransition(); 667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (endTransition != null) { 668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(endTransition, mediaItem.getId()); 669ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 670ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 671ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 674ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 676ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Now we can add clips by tapping the beginning view 6788577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.VISIBLE); 679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 682fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Inserts a new media item after the specified media item id. 683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItem The media item 685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItemId The id of the media item preceding the media item 686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void insertMediaItem(MovieMediaItem mediaItem, String afterMediaItemId) { 688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View mediaItemView = inflate(getContext(), R.layout.media_item, null); 689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ((MediaItemView)mediaItemView).setGestureListener(mMediaItemGestureListener); 690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ((MediaItemView)mediaItemView).setProjectPath(mProject.getPath()); 691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItemView.setTag(mediaItem); 693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int insertViewIndex; 695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItemId != null) { 696ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if ((insertViewIndex = getMediaItemViewIndex(afterMediaItemId)) == -1) { 697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Log.e(TAG, "Media item not found: " + afterMediaItemId); 698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi insertViewIndex++; 702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (insertViewIndex < getChildCount()) { 704ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(insertViewIndex).getTag(); 705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the transition following the media item 707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(insertViewIndex); 708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // Insert at the beginning 711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If we have a transition at the beginning remove it 712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(1).getTag(); 713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(1); 715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 716ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 717ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi insertViewIndex = 1; 718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Add the new view 721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.FILL_PARENT); 723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(mediaItemView, insertViewIndex, lp); 724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If the new media item has beginning and end transitions add them 726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition beginTransition = mediaItem.getBeginTransition(); 727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (beginTransition != null) { 728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (insertViewIndex > 1) { // There is a previous view (transition or media item) 729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View view = getChildAt(insertViewIndex - 1); 730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = view.getTag(); 731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Do not add transition if it already exists 732ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 733ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem prevMediaItem = (MovieMediaItem)tag; 734ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(beginTransition, prevMediaItem.getId()); 735ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 736ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // This is the first media item 737ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(beginTransition, null); 738ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 739ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 740ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 741ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition endTransition = mediaItem.getEndTransition(); 742ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (endTransition != null) { 743ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(endTransition, mediaItem.getId()); 744ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 745ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 746ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 747ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 748ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 749ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 750ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 751ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 752ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Now we can add clips by tapping the beginning view 7538577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.VISIBLE); 754ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 755ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 756ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 75724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Updates the specified media item. 758ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 75924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @param mediaItem The media item to be updated 760ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 761ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void updateMediaItem(MovieMediaItem mediaItem) { 762ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final String mediaItemId = mediaItem.getId(); 763ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 764ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 765ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 766ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 767ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 76824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieMediaItem mi = (MovieMediaItem) tag; 769ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemId.equals(mi.getId())) { 770ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem != mi) { 771ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // The media item is a new instance of the media item 772ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi childView.setTag(mediaItem); 773ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem.getBeginTransition() != null) { 774ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (i > 0) { 775ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View tView = getChildAt(i - 1); 776ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tagT = tView.getTag(); 777ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tagT != null && tagT instanceof MovieTransition) { 778ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi tView.setTag(mediaItem.getBeginTransition()); 779ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 780ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 781ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 782ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 783ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem.getEndTransition() != null) { 784ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (i < childrenCount - 1) { 785ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View tView = getChildAt(i + 1); 786ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tagT = tView.getTag(); 787ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tagT != null && tagT instanceof MovieTransition) { 788ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi tView.setTag(mediaItem.getEndTransition()); 789ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 790ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 791ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 792ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 793ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 794ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (childView.isSelected()) { 795ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(true); 796ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(true); 797ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 798ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 800ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 801ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 802ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 803ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 804ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 805ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 806ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 807ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 808ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 809ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 810ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 811ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 812fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Removes a media item view. 813ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 814ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId The media item id 815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transition The transition inserted at the removal position 816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * if a theme is in use. 817ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 818ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The view which was removed 819ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 820ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public View removeMediaItem(String mediaItemId, MovieTransition transition) { 821ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 822ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MovieMediaItem prevMediaItem = null; 823ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 824ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 825ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 826ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 827ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mi = (MovieMediaItem)tag; 828ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemId.equals(mi.getId())) { 829ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int mediaItemViewIndex = i; 830ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 831ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the before transition 832ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemViewIndex > 0) { 833ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object beforeTag = getChildAt(mediaItemViewIndex - 1).getTag(); 834ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (beforeTag != null && beforeTag instanceof MovieTransition) { 835ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the transition view 836ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(mediaItemViewIndex - 1); 837ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItemViewIndex--; 838ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 839ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 840ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 841ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the after transition view 842ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemViewIndex < getChildCount() - 1) { 843ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object afterTag = getChildAt(mediaItemViewIndex + 1).getTag(); 844ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterTag != null && afterTag instanceof MovieTransition) { 845ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the transition view 846ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(mediaItemViewIndex + 1); 847ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 848ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 849ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 850ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the media item view 851ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(mediaItemViewIndex); 852ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 853ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transition != null) { 854ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(transition, 855ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi prevMediaItem != null ? prevMediaItem.getId() : null); 856ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 857ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 858ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 859ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 860ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 861ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 862ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mProject.getMediaItemCount() == 0) { 863ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // We cannot add clips by tapping the beginning view 8648577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.GONE); 865ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 866ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return childView; 867ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 868ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 869ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi prevMediaItem = mi; 870ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 871ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 873ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 874ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 875ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 876ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 87724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Creates a new transition. 878ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 879ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItemId Insert the transition after this media item id 880ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionType The transition type 881ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionDurationMs The transition duration in ms 882ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 883ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void addTransition(String afterMediaItemId, int transitionType, 884ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long transitionDurationMs) { 88524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 886ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 887ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem afterMediaItem; 888ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItemId != null) { 889ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItem = mProject.getMediaItem(afterMediaItemId); 890ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItem == null) { 891ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 892ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 893ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 894ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItem = null; 895ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 896ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 897ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final String id = ApiService.generateId(); 898ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (transitionType) { 899ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_ALPHA_CONTOUR: { 900ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertAlphaTransition(getContext(), mProject.getPath(), 901ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 902ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi R.raw.mask_contour, 50, false); 903ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 904ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 905ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 906ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_ALPHA_DIAGONAL: { 907ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertAlphaTransition(getContext(), mProject.getPath(), 908ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 909ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi R.raw.mask_diagonal, 50, false); 910ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 911ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 912ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 913ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_CROSSFADE: { 914ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertCrossfadeTransition(getContext(), mProject.getPath(), 915ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR); 916ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 917ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 918ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 919ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_FADE_BLACK: { 920ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertFadeBlackTransition(getContext(), mProject.getPath(), 921ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR); 922ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 923ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 924ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 925ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_SLIDING_RIGHT_OUT_LEFT_IN: { 926ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertSlidingTransition(getContext(), mProject.getPath(), 927ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 928ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TransitionSliding.DIRECTION_RIGHT_OUT_LEFT_IN); 929ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 930ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 931ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 932ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_SLIDING_LEFT_OUT_RIGHT_IN: { 933ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertSlidingTransition(getContext(), mProject.getPath(), 934ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 935ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TransitionSliding.DIRECTION_LEFT_OUT_RIGHT_IN); 936ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 937ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 938ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 939ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_SLIDING_TOP_OUT_BOTTOM_IN: { 940ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertSlidingTransition(getContext(), mProject.getPath(), 941ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 942ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TransitionSliding.DIRECTION_TOP_OUT_BOTTOM_IN); 943ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 944ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 945ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 946ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case TransitionType.TRANSITION_TYPE_SLIDING_BOTTOM_OUT_TOP_IN: { 947ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.insertSlidingTransition(getContext(), mProject.getPath(), 948ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItemId, id, transitionDurationMs, Transition.BEHAVIOR_LINEAR, 949ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TransitionSliding.DIRECTION_BOTTOM_OUT_TOP_IN); 950ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 951ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 952ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 953ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 954ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 955ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 956ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 95705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 95805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi if (mMediaItemActionMode != null) { 95905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi mMediaItemActionMode.invalidate(); 96005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 961ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 962ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 963ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 96424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Edits a transition. 965ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 966ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItemId Insert the transition after this media item id 967ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 968ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionType The transition type 969ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionDurationMs The transition duration in ms 970ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 971ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void editTransition(String afterMediaItemId, String transitionId, int transitionType, 972ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long transitionDurationMs) { 973ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = mProject.getTransition(transitionId); 974ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transition == null) { 975ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 976ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 977ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 978ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Check if the type or duration had changed 979ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transition.getType() != transitionType) { 980ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the transition and add it again 981ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.removeTransition(getContext(), mProject.getPath(), transitionId); 982ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addTransition(afterMediaItemId, transitionType, transitionDurationMs); 983ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (transition.getAppDuration() != transitionDurationMs) { 984404feb6ef8c01d13d4d98ae19a4ae07a19a1c4c7Gil Dobjanschi transition.setAppDuration(transitionDurationMs); 985ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setTransitionDuration(getContext(), mProject.getPath(), transitionId, 986ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi transitionDurationMs); 987ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 98805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 98905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi if (mMediaItemActionMode != null) { 99005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi mMediaItemActionMode.invalidate(); 99105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 992ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 993ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 994ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 99524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Adds a new transition after the specified media id. This method assumes that a 99624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * transition does not exist at the insertion point. 997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 99824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @param transition The transition to be added 999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItemId After the specified media item id 1000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 100124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @return The transition view that was added, {@code null} upon errors. 1002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public View addTransition(MovieTransition transition, String afterMediaItemId) { 1004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Determine the insert position 1005ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int index; 1006ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItemId != null) { 1007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi index = -1; 1008ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 1009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 1010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(i).getTag(); 1011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 101224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieMediaItem mi = (MovieMediaItem) tag; 1013ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItemId.equals(mi.getId())) { 1014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi index = i + 1; 1015ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1016ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (index < 0) { 1021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Log.e(TAG, "addTransition media item not found: " + afterMediaItemId); 1022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1024ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 1025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi index = 1; 1026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View transitionView = inflate(getContext(), R.layout.transition_view, null); 102924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((TransitionView) transitionView).setGestureListener(mTransitionGestureListener); 103024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((TransitionView) transitionView).setProjectPath(mProject.getPath()); 1031ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi transitionView.setTag(transition); 1032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 1034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.FILL_PARENT); 1035ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi addView(transitionView, index, lp); 1036ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Adjust the size of all the views 1038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 1039ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If this transition was added by the user invalidate the menu item 1041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 1042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 1043ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return transitionView; 1046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 104924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Updates a transition. 1050ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1051ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 1052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void updateTransition(String transitionId) { 1054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 1055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi invalidate(); 1056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1058ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 105924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Removes a transition with the specified id. 1060ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 1062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void removeTransition(String transitionId) { 1064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 1065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 1066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(i).getTag(); 1067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 1068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = (MovieTransition)tag; 1069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transitionId.equals(transition.getId())) { 1070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the view 1071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(i); 1072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Adjust the size of all the views 1074ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 1075ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1076ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If this transition was removed by the user invalidate the menu item 1077ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 1078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 1079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 1082ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1083ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1086ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1088fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Invalidates the available action modes. Used to refresh menu contents. 108905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi */ 1090fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng public void invalidateActionBar() { 109105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi if (mMediaItemActionMode != null) { 109205665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi mMediaItemActionMode.invalidate(); 109305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 1094fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (mTransitionActionMode != null) { 1095fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng mTransitionActionMode.invalidate(); 1096fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 109705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 109805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 109905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi /** 1100fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * A Ken Burns movie is encoded for an MediaImageItem. 1101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId The media item id 1103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param action The action 1104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param progress Progress value (between 0..100) 1105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onGeneratePreviewMediaItemProgress(String mediaItemId, int action, int progress) { 1107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Display the progress while generating the Ken Burns video clip 110824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MediaItemView view = (MediaItemView) getMediaItemView(mediaItemId); 1109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view != null) { 111024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.setGeneratingEffectProgress(progress); 1111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view.isSelected()) { 1113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (progress == 0) { 1114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(false); 1115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(false); 1116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (progress == 100) { 1117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(true); 1118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(true); 1119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 112524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * A transition is being encoded. 1126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 1128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param action The action 1129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param progress The progress 1130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onGeneratePreviewTransitionProgress(String transitionId, int action, 1132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int progress) { 1133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Display the progress while generating the transition 113424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final TransitionView view = (TransitionView) getTransitionView(transitionId); 1135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view != null) { 113624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.setGeneratingTransitionProgress(progress); 1137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (view.isSelected()) { 1139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (progress == 0) { 1140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(false); 1141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(false); 1142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (progress == 100) { 1143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(true); 1144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(true); 1145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1151fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Creates a new effect on the specified media item. 1152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param effectType The effect type 1154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId Add the effect for this media item id 1155fbf19296b20e6d1948bc0e46c779ec576c514f4fGil Dobjanschi * @param startRect The start rectangle 1156fbf19296b20e6d1948bc0e46c779ec576c514f4fGil Dobjanschi * @param endRect The end rectangle 1157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1158fbf19296b20e6d1948bc0e46c779ec576c514f4fGil Dobjanschi public void addEffect(int effectType, String mediaItemId, Rect startRect, Rect endRect) { 1159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = mProject.getMediaItem(mediaItemId); 1160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem == null) { 1161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Log.e(TAG, "addEffect media item not found: " + mediaItemId); 1162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 1163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final String id = ApiService.generateId(); 1166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (effectType) { 1167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case EffectType.EFFECT_KEN_BURNS: { 1168fbf19296b20e6d1948bc0e46c779ec576c514f4fGil Dobjanschi ApiService.addEffectKenBurns(getContext(), mProject.getPath(), mediaItemId, 1169fbf19296b20e6d1948bc0e46c779ec576c514f4fGil Dobjanschi id, 0, mediaItem.getDuration(), startRect, endRect); 1170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case EffectType.EFFECT_COLOR_GRADIENT: { 1174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.addEffectColor(getContext(), mProject.getPath(), mediaItemId, id, 0, 1175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getDuration(), EffectColor.TYPE_GRADIENT, 1176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi EffectColor.GRAY); 1177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case EffectType.EFFECT_COLOR_SEPIA: { 1181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.addEffectColor(getContext(), mProject.getPath(), mediaItemId, id, 0, 1182ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getDuration(), EffectColor.TYPE_SEPIA, 0); 1183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case EffectType.EFFECT_COLOR_NEGATIVE: { 1187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.addEffectColor(getContext(), mProject.getPath(), mediaItemId, id, 0, 1188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getDuration(), EffectColor.TYPE_NEGATIVE, 0); 1189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 1193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 119605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 119705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi if (mMediaItemActionMode != null) { 119805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi mMediaItemActionMode.invalidate(); 119905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 1200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1202ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1203f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang * Set the media item thumbnail. 1204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId The media item id 1206f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang * @param bitmap The bitmap 1207f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang * @param index The index of the bitmap 1208f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang * @param token The token given in the original request 1209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1210f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang * @return true if the bitmap is used 1211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1212f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang public boolean setMediaItemThumbnail( 1213f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang String mediaItemId, Bitmap bitmap, int index, int token) { 1214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 1215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 1216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(i).getTag(); 1217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 1218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mi = (MovieMediaItem)tag; 1219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemId.equals(mi.getId())) { 1220f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang return ((MediaItemView)getChildAt(i)).setBitmap( 1221f6b29b560e55392015caebeffbe76f8a1d1ddeb4Chih-Chung Chang bitmap, index, token); 1222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1225ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1226ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 1227ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1229ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1230fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Sets the transition thumbnails. 1231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1232ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 1233ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param bitmaps The bitmaps array 1234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1235ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return true if the bitmaps were used 1236ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1237ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean setTransitionThumbnails(String transitionId, Bitmap[] bitmaps) { 1238ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 1239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 1240ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(i).getTag(); 1241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 1242ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = (MovieTransition)tag; 1243ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transitionId.equals(transition.getId())) { 1244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return ((TransitionView)getChildAt(i)).setBitmaps(bitmaps); 1245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 1250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi @Override 1253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi protected void onLayout(boolean changed, int l, int t, int r, int b) { 125424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Compute the total duration of the project. 1255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long totalDurationMs = mProject.computeDuration(); 125624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 125724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Total available width for putting media items and transitions. 125824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // We subtract 2 half screen widths from the width because we put 125924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // 2 empty view at the beginning and end of the timeline, each with 126024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // half screen width. We then layout each child view into the 126124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // available width. 1262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int viewWidth = getWidth() - (2 * mHalfParentWidth); 1263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 126424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // If we are in trimming mode, the left view width might be different 126524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // due to trimming; otherwise it equals half of screen width. 126624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int leftViewWidth = (mSelectedView != null) ? 126724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng (Integer) mScrollView.getTag(R.id.left_view_width) : mHalfParentWidth; 126824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 126924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Top and bottom position are fixed for media item views. For transition views, 127024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // there is additional inset which makes them smaller. See below. 127124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int top = getPaddingTop(); 127224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int bottom = b - t; 127324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 1274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long startMs = 0; 1275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int left = 0; 1276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 127724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int childrenCount = getChildCount(); 127824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng for (int i = 0; i < childrenCount; i++) { 127924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final View view = getChildAt(i); 128024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final Object tag = view.getTag(); 128124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (tag != null) { 128224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final long durationMs = computeViewDuration(view); 1283ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 128424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int right = (int)((float)((startMs + durationMs) * viewWidth) / 128524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng (float)totalDurationMs) + leftViewWidth; 1286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 128724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (tag instanceof MovieMediaItem) { 128824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (left != view.getLeft() || right != view.getRight()) { 128924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int oldLeft = view.getLeft(); 129024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int oldRight = view.getRight(); 129124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(left, top, right, bottom); 129224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((MediaItemView) view).onLayoutPerformed(oldLeft, oldRight); 129324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else { 129424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(left, top, right, bottom); 1295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 129624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else { // Transition view. 129724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Note that we set additional inset so it looks smaller 129824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // than media item views on the timeline. 129924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(left, 130024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng top + mTransitionVerticalInset, 130124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng right, 130224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng bottom - mTransitionVerticalInset); 130324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 130424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 130524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng startMs += durationMs; 130624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng left = right; 130724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else if (view == mLeftHandle && mSelectedView != null) { 130824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // We are in trimming mode, the left handle must be shown. 130924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(mSelectedView.getLeft() - mHandleWidth, 131024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng top + mSelectedView.getPaddingTop(), 131124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mSelectedView.getLeft(), 131224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng bottom - mSelectedView.getPaddingBottom()); 131324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else if (view == mRightHandle && mSelectedView != null) { 131424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // We are in trimming mode, the right handle must be shown. 131524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(mSelectedView.getRight(), 131624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng top + mSelectedView.getPaddingTop(), 131724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mSelectedView.getRight() + mHandleWidth, 131824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng bottom - mSelectedView.getPaddingBottom()); 131924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else if (i == 0) { // Begin view 132024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(0, top, leftViewWidth, bottom); 132124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng left += leftViewWidth; 132224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else { // End view 132324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.layout(left, top, getWidth(), bottom); 1324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1326c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mMoveLayoutPending = false; 1327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 133024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Computes the duration of the specified view. 1331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 133224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @param view The specified view 1333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 133424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @return The duration in milliseconds, 0 if the specified view is not a media item view 133524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * or a transition view 1336ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long computeViewDuration(View view) { 1338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long durationMs; 1339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = view.getTag(); 1340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null) { 1341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag instanceof MovieMediaItem) { 134224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieMediaItem mediaItem = (MovieMediaItem) view.getTag(); 1343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs = mediaItem.getAppTimelineDuration(); 1344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem.getBeginTransition() != null) { 1345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs -= mediaItem.getBeginTransition().getAppDuration(); 1346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem.getEndTransition() != null) { 1349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs -= mediaItem.getEndTransition().getAppDuration(); 1350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 135124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } else { // Transition 135224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieTransition transition = (MovieTransition) tag; 1353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs = transition.getAppDuration(); 1354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 1356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs = 0; 1357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return durationMs; 1360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1363fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Creates a new dialog. 1364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param id The dialog id 1366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param bundle The dialog bundle 1367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The dialog 1369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public Dialog onCreateDialog(int id, final Bundle bundle) { 1371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If the project is not yet loaded do nothing. 1372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mProject == null) { 1373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (id) { 1377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case VideoEditorActivity.DIALOG_REMOVE_MEDIA_ITEM_ID: { 1378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = mProject.getMediaItem( 1379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.getString(PARAM_DIALOG_MEDIA_ITEM_ID)); 1380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem == null) { 1381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1384fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Activity activity = (Activity) getContext(); 1385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return AlertDialogs.createAlert(activity, 1386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi FileUtils.getSimpleName(mediaItem.getFilename()), 1387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 0, mediaItem.isVideoClip() ? 1388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.editor_remove_video_question) : 1389ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.editor_remove_image_question), 1390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.yes), 1391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi new DialogInterface.OnClickListener() { 1392fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 139448a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi if (mMediaItemActionMode != null) { 139548a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi mMediaItemActionMode.finish(); 139648a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi mMediaItemActionMode = null; 139748a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi } 139824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 1399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_MEDIA_ITEM_ID); 1401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.removeMediaItem(activity, mProject.getPath(), mediaItem.getId(), 1403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getTheme()); 1404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, activity.getString(R.string.no), new DialogInterface.OnClickListener() { 1406fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 1408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_MEDIA_ITEM_ID); 1409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, new DialogInterface.OnCancelListener() { 1411fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onCancel(DialogInterface dialog) { 1413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_MEDIA_ITEM_ID); 1414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, true); 1416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case VideoEditorActivity.DIALOG_CHANGE_RENDERING_MODE_ID: { 1419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = mProject.getMediaItem( 1420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.getString(PARAM_DIALOG_MEDIA_ITEM_ID)); 1421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem == null) { 1422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Activity activity = (Activity)getContext(); 1426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 1427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setTitle(activity.getString(R.string.editor_change_rendering_mode)); 1428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final CharSequence[] renderingModeStrings = new CharSequence[3]; 1429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi renderingModeStrings[0] = getContext().getString(R.string.rendering_mode_black_borders); 1430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi renderingModeStrings[1] = getContext().getString(R.string.rendering_mode_stretch); 1431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi renderingModeStrings[2] = getContext().getString(R.string.rendering_mode_crop); 1432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int currentRenderingMode = bundle.getInt(PARAM_DIALOG_CURRENT_RENDERING_MODE); 1434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int currentRenderingModeIndex; 1435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (currentRenderingMode) { 1436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case MediaItem.RENDERING_MODE_CROPPING: { 1437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi currentRenderingModeIndex = 2; 1438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1441ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case MediaItem.RENDERING_MODE_STRETCH: { 1442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi currentRenderingModeIndex = 1; 1443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1445ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case MediaItem.RENDERING_MODE_BLACK_BORDER: 1447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 1448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi currentRenderingModeIndex = 0; 1449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setSingleChoiceItems(renderingModeStrings, currentRenderingModeIndex, 1454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi new DialogInterface.OnClickListener() { 1455fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 1457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (which) { 1458ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 0: { 1459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.setAppRenderingMode(MediaItem.RENDERING_MODE_BLACK_BORDER); 1460ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemRenderingMode(getContext(), 1461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getPath(), mediaItem.getId(), 1462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MediaItem.RENDERING_MODE_BLACK_BORDER); 1463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1464ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 1: { 1467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.setAppRenderingMode(MediaItem.RENDERING_MODE_STRETCH); 1468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemRenderingMode(getContext(), 1469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getPath(), 1470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getId(), MediaItem.RENDERING_MODE_STRETCH); 1471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1474ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 2: { 1475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.setAppRenderingMode(MediaItem.RENDERING_MODE_CROPPING); 1476ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemRenderingMode(getContext(), 1477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getPath(), 1478ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getId(), MediaItem.RENDERING_MODE_CROPPING); 1479ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1480ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 1483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_CHANGE_RENDERING_MODE_ID); 1487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 1489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setCancelable(true); 1490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 1491fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1492ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onCancel(DialogInterface dialog) { 1493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_CHANGE_RENDERING_MODE_ID); 1494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 1496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return builder.create(); 1497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case VideoEditorActivity.DIALOG_REMOVE_TRANSITION_ID: { 1500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = mProject.getTransition( 1501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.getString(PARAM_DIALOG_TRANSITION_ID)); 1502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transition == null) { 1503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1506fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Activity activity = (Activity) getContext(); 1507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return AlertDialogs.createAlert(activity, 1508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.remove), 1509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 0, activity.getString(R.string.editor_remove_transition_question), 1510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.yes), 1511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi new DialogInterface.OnClickListener() { 1512fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 151448a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi if (mTransitionActionMode != null) { 151548a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi mTransitionActionMode.finish(); 151648a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi mTransitionActionMode = null; 151748a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi } 151824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 1519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_TRANSITION_ID); 1520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.removeTransition(activity, mProject.getPath(), 1522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi transition.getId()); 1523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, activity.getString(R.string.no), new DialogInterface.OnClickListener() { 1525fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 1527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_TRANSITION_ID); 1528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1529ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, new DialogInterface.OnCancelListener() { 1530fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onCancel(DialogInterface dialog) { 1532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_TRANSITION_ID); 1533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, true); 1535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case VideoEditorActivity.DIALOG_REMOVE_EFFECT_ID: { 1538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = mProject.getMediaItem( 1539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi bundle.getString(PARAM_DIALOG_MEDIA_ITEM_ID)); 1540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItem == null) { 1541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1544fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Activity activity = (Activity) getContext(); 1545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return AlertDialogs.createAlert(activity, 1546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi FileUtils.getSimpleName(mediaItem.getFilename()), 1547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 0, activity.getString(R.string.editor_remove_effect_question), 1548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.getString(R.string.yes), 1549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi new DialogInterface.OnClickListener() { 1550fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 1552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_EFFECT_ID); 1553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.removeEffect(activity, mProject.getPath(), 1555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mediaItem.getId(), mediaItem.getEffect().getId()); 155605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi 155705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi if (mMediaItemActionMode != null) { 155805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi mMediaItemActionMode.invalidate(); 155905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi } 1560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, activity.getString(R.string.no), new DialogInterface.OnClickListener() { 1562fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1563ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 1564ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_EFFECT_ID); 1565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1566ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, new DialogInterface.OnCancelListener() { 1567fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 1568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onCancel(DialogInterface dialog) { 1569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_EFFECT_ID); 1570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }, true); 1572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1573ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 1575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 1576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1578ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi @Override 1581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public boolean onDragEvent(DragEvent event) { 1582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi boolean result = false; 1583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (event.getAction()) { 1584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DRAG_STARTED: { 1585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Claim to accept any dragged content 15860822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 15870822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "ACTION_DRAG_STARTED: " + event); 15880822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 15893cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 15903cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi mDragMediaItemId = (String)event.getLocalState(); 15913cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 1592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Hide the handles while dragging 1593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setVisibility(View.GONE); 1594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setVisibility(View.GONE); 1595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 159620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = null; 159720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 159820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 15998401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi mFirstEntered = true; 1600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // This view accepts drag 1601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi result = true; 1602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DRAG_ENTERED: { 16060822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 16070822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "ACTION_DRAG_ENTERED: " + event); 16080822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 16098401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi 16108401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi if (!mFirstEntered && mDropIndex >= 0) { 161124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 16128401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_OK); 16138401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi } else { 161424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 16158401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_NOT_OK); 16168401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi } 161724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 16188401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi 16198401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi mFirstEntered = false; 1620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DRAG_EXITED: { 16240822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 16250822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "ACTION_DRAG_EXITED: " + event); 16260822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 162720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 162820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "normal playhead" 162924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, TimelineHorizontalScrollView.PLAYHEAD_NORMAL); 163024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 1631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DRAG_ENDED: { 16350822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 16360822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "ACTION_DRAG_ENDED: " + event); 16370822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 16383cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 16393cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi mDragMediaItemId = null; 164020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 16413cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 1642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Hide the handles while dragging 1643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setVisibility(View.VISIBLE); 1644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setVisibility(View.VISIBLE); 1645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 164620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "normal playhead" 164724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, TimelineHorizontalScrollView.PLAYHEAD_NORMAL); 164824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 164920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 1650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 1651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DRAG_LOCATION: { 165520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 165620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi Log.v(TAG, "ACTION_DRAG_LOCATION: " + event); 1657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 165920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi moveToPosition(event.getX()); 1660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // We returned true to DRAG_STARTED, so return true here 1661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi result = true; 1662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case DragEvent.ACTION_DROP: { 16660822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 16670822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "ACTION_DROP: " + event); 16680822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 16690822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi 16703cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (mDropIndex >= 0) { 16713cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final String afterMediaItemId = 16723cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi mDropAfterMediaItem != null ? mDropAfterMediaItem.getId() : null; 16730822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.DEBUG)) { 16743cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi Log.d(TAG, "ACTION_DROP: Index: " + mDropIndex + " | " + afterMediaItemId); 16750822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 16763cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi ApiService.moveMediaItem(getContext(), mProject.getPath(), mDragMediaItemId, 16773cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi afterMediaItemId, null); 16780822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 1679ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi result = true; 1680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 16850822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi if (Log.isLoggable(TAG, Log.VERBOSE)) { 16860822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi Log.v(TAG, "Other drag event: " + event); 16870822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 1688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi result = true; 1689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi break; 1690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return result; 1694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1696ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 169720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi * Move the playhead during a move operation 169820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi * 169920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi * @param eventX The event horizontal position 170020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi */ 170120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi private void moveToPosition(float eventX) { 170224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final int x = (int)eventX - mScrollView.getScrollX(); 170320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi final long now = System.currentTimeMillis(); 170420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (now - mPrevDragScrollTime > 300) { 17058401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi if (x < mPrevDragPosition - 42) { // Backwards 170620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi final long positionMs = getLeftDropPosition(); 170720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (mDropIndex >= 0) { 170820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "move ok playhead" 170924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 171020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_OK); 171120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 171220e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "move not ok playhead" 171324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 171420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_NOT_OK); 171520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 171620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 171720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mListener.onRequestMovePlayhead(positionMs, true); 171824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 171920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 172020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mPrevDragPosition = x; 172120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mPrevDragScrollTime = now; 17228401ea989541400f80524ae6969e51d373d9d2faGil Dobjanschi } else if (x > mPrevDragPosition + 42) { // Forward 172320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi final long positionMs = getRightDropPosition(); 172420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (mDropIndex >= 0) { 172520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "move ok playhead" 172624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 172720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_OK); 172820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 172920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Redraw the "move not ok playhead" 173024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_type, 173120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi TimelineHorizontalScrollView.PLAYHEAD_MOVE_NOT_OK); 173220e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 173320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 173420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mListener.onRequestMovePlayhead(positionMs, true); 173524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 173620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 173720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mPrevDragPosition = x; 173820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mPrevDragScrollTime = now; 173920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 174020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 174120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mPrevDragPosition = x; 174220e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 174320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 174420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi 1745675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang // Returns the begin time of a media item (exclude transition). 1746675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang private long getBeginTime(MovieMediaItem item) { 1747675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final List<MovieMediaItem> mediaItems = mProject.getMediaItems(); 1748675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang long beginMs = 0; 1749675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final int mediaItemsCount = mediaItems.size(); 1750675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang for (int i = 0; i < mediaItemsCount; i++) { 1751675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieMediaItem mediaItem = mediaItems.get(i); 1752675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieTransition beginTransition = mediaItem.getBeginTransition(); 1753675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieTransition endTransition = mediaItem.getEndTransition(); 1754675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1755675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang if (item.getId().equals(mediaItem.getId())) { 1756675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang if (beginTransition != null) { 1757675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang beginMs += beginTransition.getAppDuration(); 1758675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1759675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang return beginMs; 1760675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1761675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1762675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang beginMs += mediaItem.getAppTimelineDuration(); 1763675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1764675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang if (endTransition != null) { 1765675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang beginMs -= endTransition.getAppDuration(); 1766675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1767675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1768675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1769675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang return 0; 1770675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1771675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1772675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang // Returns the end time of a media item (exclude transition) 1773675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang private long getEndTime(MovieMediaItem item) { 1774675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final List<MovieMediaItem> mediaItems = mProject.getMediaItems(); 1775675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang long endMs = 0; 1776675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final int mediaItemsCount = mediaItems.size(); 1777675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang for (int i = 0; i < mediaItemsCount; i++) { 1778675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieMediaItem mediaItem = mediaItems.get(i); 1779675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieTransition beginTransition = mediaItem.getBeginTransition(); 1780675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang final MovieTransition endTransition = mediaItem.getEndTransition(); 1781675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1782675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang endMs += mediaItem.getAppTimelineDuration(); 1783675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1784675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang if (endTransition != null) { 1785675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang endMs -= endTransition.getAppDuration(); 1786675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1787675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1788675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang if (item.getId().equals(mediaItem.getId())) { 1789675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang return endMs; 1790675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1791675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1792675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1793675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 1794675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang return 0; 1795675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang } 1796675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 179720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi /** 17983cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi * @return The valid time location of the drop (-1 if none) 1799ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 18003cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi private long getLeftDropPosition() { 18013cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final List<MovieMediaItem> mediaItems = mProject.getMediaItems(); 18023cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long beginMs = 0; 18033cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long endMs = 0; 18043cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long timeMs = mProject.getPlayheadPos(); 18053cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18063cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final int mediaItemsCount = mediaItems.size(); 180720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi for (int i = 0; i < mediaItemsCount; i++) { 18083cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final MovieMediaItem mediaItem = mediaItems.get(i); 18093cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18103cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi endMs = beginMs + mediaItem.getAppTimelineDuration(); 18113cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18123cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (mediaItem.getEndTransition() != null) { 18133cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (i < mediaItemsCount - 1) { 18143cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi endMs -= mediaItem.getEndTransition().getAppDuration(); 1815ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1816ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 18173cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18183cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (timeMs > beginMs && timeMs <= endMs) { 181920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (mediaItem.getBeginTransition() != null) { 182020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi beginMs += mediaItem.getBeginTransition().getAppDuration(); 182120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 18223cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 182320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (!mDragMediaItemId.equals(mediaItem.getId())) { 182420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (i > 0) { 182520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Check if the previous item is the drag item 182620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi final MovieMediaItem prevMediaItem = mediaItems.get(i - 1); 182720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (!mDragMediaItemId.equals(prevMediaItem.getId())) { 182820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = prevMediaItem; 182920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = i; 183020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return beginMs; 183120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 183220e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = null; 183320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 183420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return beginMs; 183520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 183620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 183720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = null; 183820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = 0; 183920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return 0; 18403cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18413cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } else { 18423cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi mDropAfterMediaItem = null; 184320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 184420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return beginMs; 18453cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18463cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18473cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 184820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi beginMs = endMs; 18490822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 18500822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi 185120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return timeMs; 1852ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1853ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1854ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 18553cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi * @return The valid time location of the drop (-1 if none) 1856ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 18573cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi private long getRightDropPosition() { 18583cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final List<MovieMediaItem> mediaItems = mProject.getMediaItems(); 18593cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long beginMs = 0; 18603cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long endMs = 0; 18613cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi long timeMs = mProject.getPlayheadPos(); 18623cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18633cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final int mediaItemsCount = mediaItems.size(); 186420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi for (int i = 0; i < mediaItemsCount; i++) { 18653cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi final MovieMediaItem mediaItem = mediaItems.get(i); 18663cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18673cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi endMs = beginMs + mediaItem.getAppTimelineDuration(); 18683cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18693cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (mediaItem.getEndTransition() != null) { 18703cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (i < mediaItemsCount - 1) { 18713cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi endMs -= mediaItem.getEndTransition().getAppDuration(); 1872ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 18733cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18743cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 18753cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi if (timeMs >= beginMs && timeMs < endMs) { 187620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (!mDragMediaItemId.equals(mediaItem.getId())) { 187720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (i < mediaItemsCount - 1) { 187820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi // Check if the next item is the drag item 187920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi final MovieMediaItem nextMediaItem = mediaItems.get(i + 1); 188020e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi if (!mDragMediaItemId.equals(nextMediaItem.getId())) { 188120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = mediaItem; 188220e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = i; 188320e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return endMs; 188420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 188520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = null; 188620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 188720e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return endMs; 188820e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } 188920e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi } else { 18903cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi mDropAfterMediaItem = mediaItem; 189120e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = i; 18923cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi return endMs; 18933cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18943cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } else { 189520e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropAfterMediaItem = null; 189620e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi mDropIndex = -1; 18973cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi return endMs; 18983cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 18993cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi } 19003cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi 19013cd879824927dc0ed4d8c04601503b1e452d4572Gil Dobjanschi beginMs = endMs; 19020822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi } 19030822a9327c402653be9e0e98773d3f54b7900797Gil Dobjanschi 190420e4a3762d9be4801bd9f988b99e65a1b844a96dGil Dobjanschi return timeMs; 1905ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1906ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1907ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1908ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1909fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Adds/edits title overlay of the specified media item. 1910ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1911fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng private void editOverlay(MovieMediaItem mediaItem) { 1912fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Intent intent = new Intent(getContext(), OverlayTitleEditor.class); 1913fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(OverlayTitleEditor.PARAM_MEDIA_ITEM_ID, mediaItem.getId()); 1914fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng 1915fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Determine if user wants to edit an existing title overlay or add a new one. 1916fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Add overlay id and attributes bundle to the extra if the overlay already exists. 1917fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final MovieOverlay overlay = mediaItem.getOverlay(); 1918fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (overlay != null) { 1919fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final String overlayId = mediaItem.getOverlay().getId(); 1920fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(OverlayTitleEditor.PARAM_OVERLAY_ID, overlayId); 1921fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Bundle attributes = MovieOverlay.buildUserAttributes( 1922fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng overlay.getType(), overlay.getTitle(), overlay.getSubtitle()); 1923fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng intent.putExtra(OverlayTitleEditor.PARAM_OVERLAY_ATTRIBUTES, 1924fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng attributes); 1925fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng } 1926fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).startActivityForResult(intent, 1927fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng VideoEditorActivity.REQUEST_CODE_PICK_OVERLAY); 1928ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1929ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1930ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1931fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Removes the overlay of the specified media item. 1932ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1933fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng private void removeOverlay(MovieMediaItem mediaItem) { 1934fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng final Bundle bundle = new Bundle(); 1935fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng bundle.putString(PARAM_DIALOG_MEDIA_ITEM_ID, mediaItem.getId()); 1936fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).showDialog( 1937fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng VideoEditorActivity.DIALOG_REMOVE_OVERLAY_ID, bundle); 1938ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1939ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1940ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1941fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Picks a transition. 1942ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1943ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItem After the media item 1944ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1945ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return true if the transition can be inserted 1946ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1947ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private boolean pickTransition(MovieMediaItem afterMediaItem) { 1948ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Check if the transition would be too short 1949ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long transitionDurationMs = getTransitionDuration(afterMediaItem); 1950ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transitionDurationMs < MINIMUM_TRANSITION_DURATION) { 1951ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Toast.makeText(getContext(), 1952ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi getContext().getString(R.string.editor_transition_too_short), 1953ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Toast.LENGTH_SHORT).show(); 1954ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 1955ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1956ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1957ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final String afterMediaId = afterMediaItem != null ? afterMediaItem.getId() : null; 1958ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Intent intent = new Intent(getContext(), TransitionsActivity.class); 1959ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_AFTER_MEDIA_ITEM_ID, afterMediaId); 1960ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_MINIMUM_DURATION, MINIMUM_TRANSITION_DURATION); 1961ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_DEFAULT_DURATION, transitionDurationMs); 1962ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_MAXIMUM_DURATION, 1963ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi getMaxTransitionDuration(afterMediaItem)); 1964fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng ((Activity) getContext()).startActivityForResult(intent, 1965ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi VideoEditorActivity.REQUEST_CODE_PICK_TRANSITION); 1966ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 1967ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1968ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1969ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 1970fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Edits a transition. 1971ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1972ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transition The transition 1973ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1974ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private void editTransition(MovieTransition transition) { 1975ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem afterMediaItem = mProject.getPreviousMediaItem(transition); 1976ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final String afterMediaItemId = afterMediaItem != null ? afterMediaItem.getId() : null; 1977ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1978ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Intent intent = new Intent(getContext(), TransitionsActivity.class); 1979ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_AFTER_MEDIA_ITEM_ID, afterMediaItemId); 1980ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_TRANSITION_ID, transition.getId()); 1981ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_TRANSITION_TYPE, transition.getType()); 1982ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_MINIMUM_DURATION, MINIMUM_TRANSITION_DURATION); 1983ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_DEFAULT_DURATION, transition.getAppDuration()); 1984ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi intent.putExtra(TransitionsActivity.PARAM_MAXIMUM_DURATION, 1985ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi getMaxTransitionDuration(afterMediaItem)); 1986ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ((Activity)getContext()).startActivityForResult(intent, 1987ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi VideoEditorActivity.REQUEST_CODE_EDIT_TRANSITION); 1988ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 1989ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1990ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 199124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Finds the media item view with the specified id. 1992ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 1993ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId The media item id 199424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @return The found media item view; null if not found 1995ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 1996ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private View getMediaItemView(String mediaItemId) { 1997ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 1998ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 1999ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 2000ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 2001ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 2002ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = (MovieMediaItem)tag; 2003ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemId.equals(mediaItem.getId())) { 2004ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return childView; 2005ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2006ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2007ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2008ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2009ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 2010ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2011ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2012ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 201324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Finds the media item view index with the specified id. 2014ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2015ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param mediaItemId The media item id 201624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @return The media item view index; -1 if not found 2017ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2018ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private int getMediaItemViewIndex(String mediaItemId) { 2019ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 2020ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 2021ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 2022ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 2023ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieMediaItem) { 2024ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem mediaItem = (MovieMediaItem)tag; 2025ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mediaItemId.equals(mediaItem.getId())) { 2026ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return i; 2027ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2028ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2029ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2030ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2031ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return -1; 2032ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2033ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2034ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 203524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Finds the transition view with the specified id. 2036ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2037ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param transitionId The transition id 2038ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 203924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @return The found transition view; null if not found 2040ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2041ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private View getTransitionView(String transitionId) { 2042ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 2043ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 2044ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 2045ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 2046ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 2047ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = (MovieTransition)tag; 2048ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transitionId.equals(transition.getId())) { 2049ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return childView; 2050ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2051ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2052ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2053ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2054ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return null; 2055ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2056ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2057ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 205824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Removes a transition. 2059ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 206024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @param transitionId The id of the transition to be removed 2061ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2062ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void removeTransitionView(String transitionId) { 2063ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 2064ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 2065ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(i).getTag(); 2066ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null && tag instanceof MovieTransition) { 2067ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieTransition transition = (MovieTransition)tag; 2068ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (transitionId.equals(transition.getId())) { 2069ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Remove the view 2070ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(i); 2071ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2072ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Adjust the size of all the views 2073ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 2074ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2075ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // If this transition was removed by the user invalidate the menu item 2076ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode != null) { 2077ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItemActionMode.invalidate(); 2078ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2079ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 2080ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2081ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2082ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2083ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2084ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2085ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 208624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Removes all media item and transition views but leave the beginning, end views, and handles. 2087ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 208824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void removeAllMediaItemAndTransitionViews() { 2089ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi int index = 0; 2090ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi while (index < getChildCount()) { 2091ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = getChildAt(index).getTag(); 209224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Media item view or transition view is associated with a media item or transition 209324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // attached as a tag. We can thus check the nullity of the tag to determine if it is 209424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // media item view or transition view. 209524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (tag != null) { 2096ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi removeViewAt(index); 2097ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 2098ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi index++; 2099ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 2102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 210324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // We cannot add clips by tapping the beginning view. 21048577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.GONE); 2105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 210824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Computes the transition duration. 2109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItem The position of the transition 2111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The transition duration 2113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long getTransitionDuration(MovieMediaItem afterMediaItem) { 2115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItem == null) { 2116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem firstMediaItem = mProject.getFirstMediaItem(); 2117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION / 2, 2118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi firstMediaItem.getAppTimelineDuration() / 4); 2119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (mProject.isLastMediaItem(afterMediaItem.getId())) { 2120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION / 2, 2121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItem.getAppTimelineDuration() / 4); 2122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 2123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem beforeMediaItem = 2124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getNextMediaItem(afterMediaItem.getId()); 2125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long minDurationMs = Math.min(afterMediaItem.getAppTimelineDuration(), 2126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi beforeMediaItem.getAppTimelineDuration()); 2127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION / 2, minDurationMs / 4); 2128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 213224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Computes the maximum transition duration. 2133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param afterMediaItem The position of the transition 2135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 2136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The transition duration 2137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long getMaxTransitionDuration(MovieMediaItem afterMediaItem) { 2139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (afterMediaItem == null) { 2140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem firstMediaItem = mProject.getFirstMediaItem(); 2141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION, 2142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi firstMediaItem.getAppTimelineDuration() / 4); 2143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (mProject.isLastMediaItem(afterMediaItem.getId())) { 2144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION, 2145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi afterMediaItem.getAppTimelineDuration() / 4); 2146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 2147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final MovieMediaItem beforeMediaItem = 2148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mProject.getNextMediaItem(afterMediaItem.getId()); 2149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long minDurationMs = Math.min(afterMediaItem.getAppTimelineDuration(), 2150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi beforeMediaItem.getAppTimelineDuration()); 2151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return Math.min(MAXIMUM_TRANSITION_DURATION, minDurationMs / 4); 2152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi @Override 2156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void setSelected(boolean selected) { 215724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // We only care about when this layout is unselected, which means all children are 215824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // unselected. Clients should never call setSelected(true) since it is no-op here. 2159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (selected == false) { 216024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng closeActionBars(); 216124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng clearAndHideTrimHandles(); 2162c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mSelectedView = null; 216305caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi showAddMediaItemButtons(true); 2164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 216524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng dispatchSetSelected(false); 216624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 2167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 216824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng /** 21691910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * Returns true if some view item on the timeline is selected. 21701910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng */ 21711910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng public boolean hasItemSelected() { 21721910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng return (mSelectedView != null); 21731910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng } 21741910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng 21751910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng /** 21761910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * Returns true if some media item is being trimmed by user. 21771910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng */ 21781910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng public boolean isTrimming() { 21791910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng return mIsTrimming; 21801910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng } 21811910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng 21821910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng /** 218324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Closes all contextual action bars. 218424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng */ 218524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void closeActionBars() { 218624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (mMediaItemActionMode != null) { 218724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mMediaItemActionMode.finish(); 218824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mMediaItemActionMode = null; 218924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 219024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 219124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (mTransitionActionMode != null) { 219224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mTransitionActionMode.finish(); 219324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mTransitionActionMode = null; 2194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2195ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 219824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Hides left and right trim handles and unregisters their listeners. 2199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 220024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void clearAndHideTrimHandles() { 220124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mLeftHandle.setVisibility(View.GONE); 220224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mLeftHandle.setListener(null); 220324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mRightHandle.setVisibility(View.GONE); 220424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mRightHandle.setListener(null); 220524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 220624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng 220724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng /** 220824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Unselects the specified view. No-op if the specified view is already unselected. 220924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng */ 221024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void unSelect(View view) { 22111910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng // Return early if the specified view is already unselected or null. 22121910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng if (view == null || !view.isSelected()) { 2213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return; 22141910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng } 2215ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 221624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mSelectedView = null; 221724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng view.setSelected(false); 22181910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng // Need to redraw other children as well because they had dimmed themselves. 22191910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 222024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng clearAndHideTrimHandles(); 222124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng } 222205caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi 222324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng /** 22241910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * Selects the specified view and un-selects all others. 22251910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * No-op if the specified view is already selected. 22261910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * The selected view will stand out and all other views on the 22271910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * timeline are dimmed. 222824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng */ 222924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void select(View selectedView) { 223024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Return early if the view is already selected. 22311910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng if (selectedView.isSelected()) { 223224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng return; 22331910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng } 2234ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 223524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng unselectAllTimelineViews(); 22361910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mSelectedView = selectedView; 22371910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mSelectedView.setSelected(true); 223824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng showAddMediaItemButtons(false); 2239ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 22401910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng final Object tag = mSelectedView.getTag(); 2241ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag instanceof MovieMediaItem) { 22421910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng final MediaItemView mediaItemView = (MediaItemView) mSelectedView; 224324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng if (mediaItemView.isGeneratingEffect()) { 2244ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(false); 2245ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(false); 2246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 2247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(true); 2248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(true); 2249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 225124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng final MovieMediaItem mi = (MovieMediaItem) tag; 2252ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMediaItemActionMode == null) { 2253ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi startActionMode(new MediaItemActionModeCallback(mi)); 2254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final boolean videoClip = mi.isVideoClip(); 2257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (videoClip) { 2258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setVisibility(View.VISIBLE); 2259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.bringToFront(); 2260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setLimitReached(mi.getAppBoundaryBeginTime() <= 0, 2261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mi.getAppTimelineDuration() <= 2262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MediaItemUtils.getMinimumVideoItemDuration()); 2263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setListener(new HandleView.MoveListener() { 2264c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi private View mTrimmedView; 2265ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private MovieMediaItem mMediaItem; 2266ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mTransitionsDurationMs; 2267ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mOriginalBeginMs, mOriginalEndMs; 2268ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mMinimumDurationMs; 2269ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private int mOriginalWidth; 2270ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private int mMovePosition; 2271ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2272fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2273ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onMoveBegin(HandleView view) { 2274ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem = (MovieMediaItem)mediaItemView.getTag(); 2275ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mTransitionsDurationMs = (mMediaItem.getBeginTransition() != null ? 2276ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getBeginTransition().getAppDuration() : 0) 2277ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi + (mMediaItem.getEndTransition() != null ? 2278ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getEndTransition().getAppDuration() : 0); 2279ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mOriginalBeginMs = mMediaItem.getAppBoundaryBeginTime(); 2280ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mOriginalEndMs = mMediaItem.getAppBoundaryEndTime(); 2281ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mOriginalWidth = mediaItemView.getWidth(); 2282ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumDurationMs = MediaItemUtils.getMinimumVideoItemDuration(); 22831910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng setIsTrimming(true); 22841910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 2285c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mTrimmedView = mediaItemView; 2286638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi 2287638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi mListener.onTrimMediaItemBegin(mMediaItem); 2288f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi if (videoClip) { // Video clip 2289f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi mListener.onTrimMediaItem(mMediaItem, 2290f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi mMediaItem.getAppBoundaryBeginTime()); 2291f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi } else { 2292f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi mListener.onTrimMediaItem(mMediaItem, 0); 2293f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi } 229438cb43c33fac470fb40e55f0a285fa2020c926c3Gil Dobjanschi // Move the playhead 229524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, view.getRight()); 229624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 2297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2299fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2300590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi public boolean onMove(HandleView view, int left, int delta) { 2301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending) { 2302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2304ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2305590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi int position = left + delta; 2306590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mMovePosition = position; 2307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Compute what will become the width of the view 2308590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi int newWidth = mTrimmedView.getRight() - position; 2309590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (newWidth == mTrimmedView.getWidth()) { 2310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Compute the new duration 2314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long newDurationMs = mTransitionsDurationMs + 2315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi (newWidth * mProject.computeDuration()) / 2316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)); 2317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (Math.abs(mMediaItem.getAppTimelineDuration() - newDurationMs) < 2318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TIME_TOLERANCE) { 2319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (newDurationMs < Math.max(2 * mTransitionsDurationMs, 2321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumDurationMs)) { 2322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = Math.max(2 * mTransitionsDurationMs, 2323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumDurationMs); 2324590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2325590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2326590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2327590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = mTrimmedView.getRight() - newWidth; 2328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (mMediaItem.getAppBoundaryEndTime() - newDurationMs < 0) { 2329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = mMediaItem.getAppBoundaryEndTime(); 2330590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2331590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2332590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2333590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = mTrimmedView.getRight() - newWidth; 2334ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 233624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // Return early if the new duration has not changed. We don't have to 233724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng // adjust the layout. 2338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (newDurationMs == mMediaItem.getAppTimelineDuration()) { 2339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.setAppExtractBoundaries( 2343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryEndTime() - newDurationMs, 2344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryEndTime()); 2345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setLimitReached(mMediaItem.getAppBoundaryBeginTime() <= 0, 2347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppTimelineDuration() <= mMinimumDurationMs); 2348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMoveLayoutPending = true; 234924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.left_view_width, 2350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHalfParentWidth - (newWidth - mOriginalWidth)); 235124318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, position); 2352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 2353ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2354ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onTrimMediaItem(mMediaItem, 2355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryBeginTime()); 2356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 2357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2359fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2360590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi public void onMoveEnd(final HandleView view, final int left, final int delta) { 2361590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi final int position = left + delta; 2362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending || (position != mMovePosition)) { 2363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(new Runnable() { 2364fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void run() { 2366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending) { 2367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(this); 2368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (position != mMovePosition) { 2369590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (onMove(view, left, delta)) { 2370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(this); 2371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 237203699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 237503699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 2379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 238003699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 238503699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi * The move is complete 2386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 238703699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi private void moveDone() { 238824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.left_view_width, mHalfParentWidth); 238924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, -1); 239038cb43c33fac470fb40e55f0a285fa2020c926c3Gil Dobjanschi 2391638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi mListener.onTrimMediaItemEnd(mMediaItem, 2392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryBeginTime()); 2393675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang mListener.onRequestMovePlayhead(getBeginTime(mMediaItem), false); 2394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (Math.abs(mOriginalBeginMs - mMediaItem.getAppBoundaryBeginTime()) > 2396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi TIME_TOLERANCE 2397ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi || Math.abs(mOriginalEndMs - mMediaItem.getAppBoundaryEndTime()) > 2398590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi TIME_TOLERANCE) { 2399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (videoClip) { // Video clip 2401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemBoundaries(getContext(), mProject.getPath(), 2402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getId(), mMediaItem.getAppBoundaryBeginTime(), 2403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryEndTime()); 2404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // Image 2405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemDuration(getContext(), mProject.getPath(), 2406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getId(), mMediaItem.getAppTimelineDuration()); 2407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long durationMs = mMediaItem.getAppTimelineDuration(); 2410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setLimitReached(durationMs <= 2411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MediaItemUtils.getMinimumMediaItemDuration(mMediaItem), 2412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi videoClip ? (mMediaItem.getAppBoundaryEndTime() >= 2413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getDuration()) : durationMs >= 2414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MAXIMUM_IMAGE_DURATION); 2415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(false); 2417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(false); 2418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 24191910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng setIsTrimming(false); 24201910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mScrollView.invalidate(); 24211910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 2422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 2424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setVisibility(View.VISIBLE); 2427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.bringToFront(); 2428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final long durationMs = mi.getAppTimelineDuration(); 2429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setLimitReached( 2430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs <= MediaItemUtils.getMinimumMediaItemDuration(mi), 2431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi videoClip ? (mi.getAppBoundaryEndTime() >= mi.getDuration()) : 2432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi durationMs >= MAXIMUM_IMAGE_DURATION); 2433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setListener(new HandleView.MoveListener() { 2434c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi private View mTrimmedView; 2435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private MovieMediaItem mMediaItem; 2436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mTransitionsDurationMs; 2437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mOriginalBeginMs, mOriginalEndMs; 2438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private long mMinimumItemDurationMs; 2439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private int mMovePosition; 2440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2441fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onMoveBegin(HandleView view) { 2443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem = (MovieMediaItem)mediaItemView.getTag(); 2444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mTransitionsDurationMs = (mMediaItem.getBeginTransition() != null ? 2445ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getBeginTransition().getAppDuration() : 0) 2446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi + (mMediaItem.getEndTransition() != null ? 2447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getEndTransition().getAppDuration() : 0); 2448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mOriginalBeginMs = mMediaItem.getAppBoundaryBeginTime(); 2449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mOriginalEndMs = mMediaItem.getAppBoundaryEndTime(); 2450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumItemDurationMs = MediaItemUtils.getMinimumMediaItemDuration(mMediaItem); 24511910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng setIsTrimming(true); 24521910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 2453c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi mTrimmedView = mediaItemView; 2454638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi 2455638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi mListener.onTrimMediaItemBegin(mMediaItem); 2456fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng if (videoClip) { // Video clip 2457f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi mListener.onTrimMediaItem(mMediaItem, mMediaItem.getAppBoundaryEndTime()); 2458f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi } else { 2459f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi mListener.onTrimMediaItem(mMediaItem, 0); 2460f6c98a9a5593733ebc6fe48fdebf3de448c5a215Gil Dobjanschi } 246138cb43c33fac470fb40e55f0a285fa2020c926c3Gil Dobjanschi 246238cb43c33fac470fb40e55f0a285fa2020c926c3Gil Dobjanschi // Move the playhead 246324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, view.getLeft()); 246424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.invalidate(); 2465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2467fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2468590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi public boolean onMove(HandleView view, int left, int delta) { 2469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending) { 2470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2473590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi int position = left + delta; 2474590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mMovePosition = position; 2475590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi 2476ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi long newDurationMs; 2477590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi // Compute what will become the width of the view 2478590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi int newWidth = position - mTrimmedView.getLeft(); 2479590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (newWidth == mTrimmedView.getWidth()) { 2480590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi return false; 2481590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi } 2482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2483590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi // Compute the new duration 2484590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newDurationMs = mTransitionsDurationMs + 2485590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (newWidth * mProject.computeDuration()) / 2486590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)); 2487590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (Math.abs(mMediaItem.getAppTimelineDuration() - newDurationMs) < 2488590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi TIME_TOLERANCE) { 2489590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi return false; 2490590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi } 2491590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi 2492590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (videoClip) { // Video clip 2493590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (newDurationMs < Math.max(2 * mTransitionsDurationMs, 2494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumItemDurationMs)) { 2495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = Math.max(2 * mTransitionsDurationMs, 2496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMinimumItemDurationMs); 2497590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2498590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2499590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2500590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = newWidth + mTrimmedView.getLeft(); 2501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (mMediaItem.getAppBoundaryBeginTime() + newDurationMs > 2502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getDuration()) { 2503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = mMediaItem.getDuration() - 2504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryBeginTime(); 2505590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2506590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2507590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2508590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = newWidth + mTrimmedView.getLeft(); 2509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (newDurationMs == mMediaItem.getAppTimelineDuration()) { 2512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.setAppExtractBoundaries(mMediaItem.getAppBoundaryBeginTime(), 2516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryBeginTime() + newDurationMs); 2517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onTrimMediaItem(mMediaItem, mMediaItem.getAppBoundaryEndTime()); 2518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // Image 2519590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (newDurationMs < Math.max(mMinimumItemDurationMs, 2520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2 * mTransitionsDurationMs)) { 2521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = Math.max(mMinimumItemDurationMs, 2522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2 * mTransitionsDurationMs); 2523590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2524590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2525590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2526590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = newWidth + mTrimmedView.getLeft(); 2527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (newDurationMs > MAXIMUM_IMAGE_DURATION) { 2528ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs = MAXIMUM_IMAGE_DURATION; 2529590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi newWidth = (int)(((newDurationMs - mTransitionsDurationMs) * 2530590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi (getWidth() - (2 * mHalfParentWidth)) / 2531590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi mProject.computeDuration())); 2532590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi position = newWidth + mTrimmedView.getLeft(); 2533ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2535590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi // Check if the duration would change 2536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (newDurationMs == mMediaItem.getAppTimelineDuration()) { 2537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return false; 2538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.setAppExtractBoundaries(0, newDurationMs); 2541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mListener.onTrimMediaItem(mMediaItem, 0); 2542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 254424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, position); 2545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setLimitReached( 2546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi newDurationMs <= mMinimumItemDurationMs, 2547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi videoClip ? (mMediaItem.getAppBoundaryEndTime() >= 2548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getDuration()) : newDurationMs >= 2549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MAXIMUM_IMAGE_DURATION); 2550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMoveLayoutPending = true; 2552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi requestLayout(); 2553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return true; 2555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2556ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2557fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2558590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi public void onMoveEnd(final HandleView view, final int left, final int delta) { 2559590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi final int position = left + delta; 2560ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending || (position != mMovePosition)) { 2561ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(new Runnable() { 2562fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng @Override 2563ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void run() { 2564ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mMoveLayoutPending) { 2565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(this); 2566ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (position != mMovePosition) { 2567590396edcdcc30e4770d19b8903f81150eab71cbGil Dobjanschi if (onMove(view, left, delta)) { 2568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mHandler.post(this); 2569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 257003699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 257303699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 2577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { 257803699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi moveDone(); 2579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 258303699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi * The move is complete 2584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 258503699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi private void moveDone() { 258624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng mScrollView.setTag(R.id.playhead_offset, -1); 258738cb43c33fac470fb40e55f0a285fa2020c926c3Gil Dobjanschi 2588638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi mListener.onTrimMediaItemEnd(mMediaItem, 2589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryEndTime()); 2590675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang mListener.onRequestMovePlayhead(getEndTime(mMediaItem), false); 2591675fa44a50be7ea5f9b9e4f533e6b01930a32411Chih-Chung Chang 2592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (Math.abs(mOriginalBeginMs - mMediaItem.getAppBoundaryBeginTime()) > 2593c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi TIME_TOLERANCE || 2594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi Math.abs(mOriginalEndMs - mMediaItem.getAppBoundaryEndTime()) > 2595c509d6b57b3dba1d24dd4e68b315f2e565ae47a5Gil Dobjanschi TIME_TOLERANCE) { 2596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (videoClip) { // Video clip 2597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemBoundaries(getContext(), mProject.getPath(), 2598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getId(), mMediaItem.getAppBoundaryBeginTime(), 2599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppBoundaryEndTime()); 2600ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else { // Image 2601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi ApiService.setMediaItemDuration(getContext(), mProject.getPath(), 2602ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getId(), mMediaItem.getAppTimelineDuration()); 2603ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2604ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2605ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (videoClip) { 2606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setLimitReached(mMediaItem.getAppBoundaryBeginTime() <= 0, 2607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mMediaItem.getAppTimelineDuration() <= mMinimumItemDurationMs); 2608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mLeftHandle.setEnabled(false); 2611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi mRightHandle.setEnabled(false); 2612ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 26131910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng setIsTrimming(false); 26141910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mScrollView.invalidate(); 26151910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 2616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2617ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 2618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (tag instanceof MovieTransition) { 2619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (mTransitionActionMode == null) { 262024318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng startActionMode(new TransitionActionModeCallback((MovieTransition) tag)); 2621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 26261910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng * Indicates if any media item is being trimmed or no. 2627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 26281910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng private void setIsTrimming(boolean isTrimming) { 26291910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng mIsTrimming = isTrimming; 2630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 2633fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * Sets the playback state for all media item views. 2634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 263524318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * @param playback indicates if the playback is ongoing 2636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 2637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private void setPlaybackState(boolean playback) { 2638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int childrenCount = getChildCount(); 2639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < childrenCount; i++) { 2640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View childView = getChildAt(i); 2641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Object tag = childView.getTag(); 2642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag != null) { 2643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi if (tag instanceof MovieMediaItem) { 264424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((MediaItemView) childView).setPlaybackMode(playback); 2645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } else if (tag instanceof MovieTransition) { 264624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((TransitionView) childView).setPlaybackMode(playback); 2647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 2651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 2652ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 265324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Un-selects all views in the timeline relative layout, including playhead view and 265424318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * the ones in audio track layout and transition layout. 2655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 265624318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng private void unselectAllTimelineViews() { 265724318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng ((RelativeLayout) getParent()).setSelected(false); 26581910b08fe7305339a8bd87d4eb7bc6e56abbfa29Shih-chia Cheng invalidateAllChildren(); 2659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 266003699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi 266103699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi /** 266224318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Invalidates all children. Note that invalidating the parent does not invalidate its children. 266303699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi */ 266403699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi private void invalidateAllChildren() { 266503699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi final int childrenCount = getChildCount(); 266603699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi for (int i = 0; i < childrenCount; i++) { 266703699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi final View childView = getChildAt(i); 266824318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng childView.invalidate(); 266903699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi } 267003699548e6f627af79aac4fd0d233f10e53841d0Gil Dobjanschi } 267105caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi 267205caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi /** 267324318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng * Shows or hides "add media buttons" on both sides of the timeline. 267405caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi * 2675fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng * @param show {@code true} to show the "Add media item" buttons, {@code false} to hide them 267605caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi */ 267705caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi private void showAddMediaItemButtons(boolean show) { 267805caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi if (show) { 2679fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng // Shows left add button iff there is at least one media item on the timeline. 26808577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi if (mProject.getMediaItemCount() > 0) { 26818577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.VISIBLE); 26828577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi } 268305caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi mRightAddClipButton.setVisibility(View.VISIBLE); 268405caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi } else { 26858577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mLeftAddClipButton.setVisibility(View.GONE); 26868577ce807351749f546c5c4ed6e3bbdbed0987d7Gil Dobjanschi mRightAddClipButton.setVisibility(View.GONE); 268705caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi } 268805caf6a39078163dd81cbc8156e58adcb973815eGil Dobjanschi } 268924318ced8e2cae0f300bd4360b8bf25d322a0b1cShih-chia Cheng} 2690