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);
181fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            romi.setEnabled(enable);
182fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng
18305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            final MenuItem btmi = menu.findItem(R.id.action_add_begin_transition);
18405665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            btmi.setVisible(mMediaItem.getBeginTransition() == null);
18505665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            btmi.setEnabled(enable);
18605665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
18705665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            final MenuItem etmi = menu.findItem(R.id.action_add_end_transition);
18805665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            etmi.setVisible(mMediaItem.getEndTransition() == null);
18905665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            etmi.setEnabled(enable);
19005665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi
19105665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            final MenuItem rmmi = menu.findItem(R.id.action_rendering_mode);
19205665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            rmmi.setVisible(mProject.hasMultipleAspectRatios());
19305665b0d312798e49b51d8a7ed9b4de328b6b86fGil Dobjanschi            rmmi.setEnabled(enable);
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