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.Dialog;
23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context;
24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.DialogInterface;
25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.os.Bundle;
26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.AttributeSet;
27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Log;
28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.ActionMode;
29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.Display;
30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.Menu;
31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.MenuItem;
32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.MotionEvent;
33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.View;
34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.LinearLayout;
35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.RelativeLayout;
36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.SeekBar;
37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.TextView;
38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
3981393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.AlertDialogs;
4081393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.VideoEditorActivity;
4181393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.ApiService;
4281393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.MovieAudioTrack;
4381393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.service.VideoEditorProject;
4481393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.util.FileUtils;
4581393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschiimport com.android.videoeditor.R;
46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/**
48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * The LinearLayout which displays audio tracks
49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */
50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class AudioTrackLinearLayout extends LinearLayout {
51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Logging
52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String TAG = "AudioTrackLinearLayout";
53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Dialog parameter ids
55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private static final String PARAM_DIALOG_AUDIO_TRACK_ID = "audio_track_id";
56ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    // Instance variables
58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final ItemSimpleGestureListener mAudioTrackGestureListener;
59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final int mAudioTrackHeight;
60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private final int mHalfParentWidth;
6148fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi    private final View mAddAudioTrackButtonView;
6248fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi    private final int mAddAudioTrackButtonWidth;
63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private AudioTracksLayoutListener mListener;
64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private ActionMode mAudioTrackActionMode;
65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private VideoEditorProject mProject;
66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private boolean mPlaybackInProgress;
67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private long mTimelineDurationMs;
68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Activity listener
71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public interface AudioTracksLayoutListener {
73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * Add an audio track
75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onAddAudioTrack();
77ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * The audio track action mode handler
81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private class AudioTrackActionModeCallback implements ActionMode.Callback,
8370f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            SeekBar.OnSeekBarChangeListener {
84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Instance variables
85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        private final MovieAudioTrack mAudioTrack;
86077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov        private int mProgress;
87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        /**
89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * Constructor
90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         *
91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         * @param audioTrack The audio track
92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi         */
93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public AudioTrackActionModeCallback(MovieAudioTrack audioTrack) {
94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrack = audioTrack;
95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
97fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
98ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
99ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode = mode;
100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
10170f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            mode.getMenuInflater().inflate(R.menu.audio_mode_menu, menu);
10270f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang
103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View titleBarView = inflate(getContext(), R.layout.audio_track_action_bar, null);
104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mode.setCustomView(titleBarView);
106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final TextView titleView = (TextView)titleBarView.findViewById(R.id.action_bar_title);
108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            titleView.setText(FileUtils.getSimpleName(mAudioTrack.getFilename()));
109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final SeekBar seekBar =
111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                ((SeekBar)titleBarView.findViewById(R.id.action_volume));
112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            seekBar.setOnSeekBarChangeListener(this);
113077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov            mProgress = mAudioTrack.getAppVolume();
114077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov            seekBar.setProgress(mProgress);
115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return true;
117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
119fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
12170f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            MenuItem duckItem = menu.findItem(R.id.action_duck);
12270f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            duckItem.setChecked(mAudioTrack.isAppDuckingEnabled());
123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return true;
124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
126fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
12870f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            switch (item.getItemId()) {
129516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                case R.id.action_duck: {
130516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                    final boolean duck = !mAudioTrack.isAppDuckingEnabled();
131516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                    mAudioTrack.enableAppDucking(duck);
132516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                    ApiService.setAudioTrackDuck(getContext(), mProject.getPath(),
133516fd1bedc49dc893d4bfbb0281aabd121e1f4f4Gil Dobjanschi                            mAudioTrack.getId(), duck);
13470f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang                    item.setChecked(duck);
135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
13870f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang                case R.id.action_remove_audio_track: {
139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final Bundle bundle = new Bundle();
140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    bundle.putString(PARAM_DIALOG_AUDIO_TRACK_ID, mAudioTrack.getId());
141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    ((Activity)getContext()).showDialog(
142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            VideoEditorActivity.DIALOG_REMOVE_AUDIO_TRACK_ID, bundle);
143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    break;
144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
14670f2e7e4d358f6da0ab03766d81a2a028cc8cec7Chih-Chung Chang            return true;
147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
149fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (fromUser) {
152077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov                mProgress = progress;
153077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov                mAudioTrack.setAppVolume(mProgress);
154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
157fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onStartTrackingTouch(SeekBar seekBar) {
159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
161fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onStopTrackingTouch(SeekBar seekBar) {
163077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov            ApiService.setAudioTrackVolume(getContext(), mProject.getPath(),
164077412e16891e40fdd5e99db481f0d0c9d94efc2Sergii Iegorov                    mAudioTrack.getId(), mProgress);
165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
167fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng        @Override
168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        public void onDestroyActionMode(ActionMode mode) {
169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View audioTrackView = getAudioTrackView(mAudioTrack.getId());
170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (audioTrackView != null) {
171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                selectView(audioTrackView, false);
172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode = null;
175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
178ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public AudioTrackLinearLayout(Context context, AttributeSet attrs, int defStyle) {
179ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        super(context, attrs, defStyle);
180ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
181ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mAudioTrackGestureListener = new ItemSimpleGestureListener() {
182fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            @Override
183ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public boolean onSingleTapConfirmed(View view, int area, MotionEvent e) {
184ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mPlaybackInProgress) {
185ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return false;
186ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
187ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
188ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (!view.isSelected()) {
189ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    selectView(view, true);
190ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
191ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
192ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return true;
193ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
194ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
195fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            @Override
196ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void onLongPress(View view, MotionEvent e) {
197ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mPlaybackInProgress) {
198ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return;
199ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
200ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
201ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (!view.isSelected()) {
2029748921feb9cfce5251dd1dd667c2c8914744d62Gil Dobjanschi                    selectView(view, true);
203ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
204ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
205ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (mAudioTrackActionMode == null) {
206ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    startActionMode(new AudioTrackActionModeCallback(
207ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            (MovieAudioTrack)view.getTag()));
208ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
209ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
210ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        };
211ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
212ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the beginning timeline item
213ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final View beginView = inflate(getContext(), R.layout.empty_timeline_item, null);
214ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        beginView.setOnClickListener(new View.OnClickListener() {
215fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            @Override
216ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void onClick(View view) {
217ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                unselectAllViews();
218ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
219ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        });
220ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        addView(beginView);
221ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
222ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Add the end timeline item
223ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final View endView = inflate(context, R.layout.empty_timeline_item, null);
224ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        endView.setOnClickListener(new View.OnClickListener() {
225fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            @Override
226ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            public void onClick(View view) {
227ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                unselectAllViews();
228ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
229ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        });
230ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        addView(endView);
231ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
23248fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        // Add the audio track button
23348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        mAddAudioTrackButtonView = inflate(getContext(), R.layout.add_audio_track_button, null);
23448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        addView(mAddAudioTrackButtonView, 1);
23548fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        mAddAudioTrackButtonView.setOnClickListener(new View.OnClickListener() {
236fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng            @Override
23748fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi            public void onClick(View view) {
23848fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                if (mListener != null) {
23948fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                    mListener.onAddAudioTrack();
24048fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                }
24148fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi            }
24248fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        });
24348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        mAddAudioTrackButtonWidth = (int)context.getResources().getDimension(
24448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                R.dimen.add_audio_track_button_width);
24548fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi
246ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Compute half the width of the screen (and therefore the parent view)
247ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final Display display = ((Activity)context).getWindowManager().getDefaultDisplay();
248ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mHalfParentWidth = display.getWidth() / 2;
249ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
250ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Get the layout height
251ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mAudioTrackHeight = (int)context.getResources().getDimension(R.dimen.audio_layout_height);
252638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi
253638d8e9b13276eab6b8de8a6f33ffbb8109d4f3eGil Dobjanschi        setMotionEventSplittingEnabled(false);
254ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
255ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
256ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public AudioTrackLinearLayout(Context context, AttributeSet attrs) {
257ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        this(context, attrs, 0);
258ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
259ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
260ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public AudioTrackLinearLayout(Context context) {
261ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        this(context, null, 0);
262ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
263ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
264ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
26543006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi     * The activity was resumed
26643006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi     */
26743006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi    public void onResume() {
26843006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        final int childrenCount = getChildCount();
26943006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        for (int i = 0; i < childrenCount; i++) {
27043006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi            final View childView = getChildAt(i);
27143006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi            final Object tag = childView.getTag();
27243006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi            if (tag != null) { // This view represents an audio track
27343006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                final AudioTrackView audioTrackView = (AudioTrackView)childView;
27443006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                if (audioTrackView.getWaveformData() == null) {
27543006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                    final MovieAudioTrack audioTrack = (MovieAudioTrack)tag;
27643006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                    if (audioTrack.getWaveformData() != null) {
27743006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                        audioTrackView.setWaveformData(audioTrack.getWaveformData());
27843006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                        audioTrackView.invalidate();
27943006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                    }
28043006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi                }
28143006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi            }
28243006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        }
28343006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi    }
28443006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi
28543006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi    /**
286ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param listener The listener
287ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
288ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setListener(AudioTracksLayoutListener listener) {
289ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mListener = listener;
290ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
291ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
292ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
293ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param project The project
294ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
295ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setProject(VideoEditorProject project) {
296ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Close the contextual action bar
297ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mAudioTrackActionMode != null) {
298ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode.finish();
299ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode = null;
300ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
301ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
302ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mProject = project;
303ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
30448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        updateAddAudioTrackButton();
305ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
30648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        removeAudioTrackViews();
307ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
308ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
309ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
310ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param inProgress true if playback is in progress
311ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
312ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setPlaybackInProgress(boolean inProgress) {
313ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mPlaybackInProgress = inProgress;
314ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
315ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Don't allow the user to interact with the audio tracks while playback
316ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // is in progress
317ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (inProgress && mAudioTrackActionMode != null) {
318ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode.finish();
319ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode = null;
320ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
321ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
322ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
323ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
324ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add the audio tracks
325ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
326ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTracks The audio tracks
327ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
328ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void addAudioTracks(List<MovieAudioTrack> audioTracks) {
329ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mAudioTrackActionMode != null) {
330ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode.finish();
331ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode = null;
332ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
333ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
33448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        updateAddAudioTrackButton();
335ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
33648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        removeAudioTrackViews();
337ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
338ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mTimelineDurationMs = mProject.computeDuration();
339ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
340ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (MovieAudioTrack audioTrack : audioTracks) {
341ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            addAudioTrack(audioTrack);
342ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
343ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
344ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
345ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
346ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Add a new audio track
347ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
348ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrack The audio track
349ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
350ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The view that was added
351ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
352ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public View addAudioTrack(MovieAudioTrack audioTrack) {
35348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        updateAddAudioTrackButton();
35448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi
355ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final AudioTrackView audioTrackView = (AudioTrackView)inflate(getContext(),
356ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                R.layout.audio_track_item, null);
357ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
358ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        audioTrackView.setTag(audioTrack);
359ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
360ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        audioTrackView.setGestureListener(mAudioTrackGestureListener);
361ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
362ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        audioTrackView.updateTimelineDuration(mTimelineDurationMs);
363ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
364ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrack.getWaveformData() != null) {
365ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            audioTrackView.setWaveformData(audioTrack.getWaveformData());
366ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
367ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            ApiService.extractAudioTrackAudioWaveform(getContext(), mProject.getPath(),
368ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    audioTrack.getId());
369ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
370ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
371ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
372ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.FILL_PARENT);
373ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        addView(audioTrackView, getChildCount() - 1, lp);
374ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
375ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mAudioTrackActionMode != null) {
376ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode.invalidate();
377ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
378ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
379ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        requestLayout();
380ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return audioTrackView;
381ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
382ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
383ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
384ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove an audio track
385ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
386ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
387ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The view which was removed
388ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
389ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public View removeAudioTrack(String audioTrackId) {
390ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int childrenCount = getChildCount();
391ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (int i = 0; i < childrenCount; i++) {
392ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View childView = getChildAt(i);
393ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieAudioTrack audioTrack = (MovieAudioTrack)childView.getTag();
394ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (audioTrack != null && audioTrack.getId().equals(audioTrackId)) {
395ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                removeViewAt(i);
396ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
39748fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                updateAddAudioTrackButton();
398ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
399ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                requestLayout();
400ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return childView;
401ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
402ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
403ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
404ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
405ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
406ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
407ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
408ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Update the audio track item
409ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
410ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
411ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
412ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void updateAudioTrack(String audioTrackId) {
413ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final AudioTrackView audioTrackView = (AudioTrackView)getAudioTrackView(audioTrackId);
414ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrackView == null) {
415ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Log.e(TAG, "updateAudioTrack: audio track view not found: " + audioTrackId);
416ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
417ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
418ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
419ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mAudioTrackActionMode != null) {
420ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            mAudioTrackActionMode.invalidate();
421ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
422ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
423ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        requestLayout();
424ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        invalidate();
425ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
426ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
427ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
428ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * An audio track is being decoded
429ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
430ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
431ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param action The action
432ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param progress The progress
433ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
434ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void onGeneratePreviewProgress(String audioTrackId, int action, int progress) {
435ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final AudioTrackView audioTrackView = (AudioTrackView)getAudioTrackView(audioTrackId);
436ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrackView == null) {
437ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Log.e(TAG, "onGeneratePreviewProgress: audio track view not found: " + audioTrackId);
438ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
439ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
440ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
44143006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        audioTrackView.setProgress(progress);
442ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
443ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
444ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
445ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the waveform progress
446ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
447ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
448ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param progress The progress
449ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
450ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setWaveformExtractionProgress(String audioTrackId, int progress) {
451ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final AudioTrackView audioTrackView = (AudioTrackView)getAudioTrackView(audioTrackId);
452ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrackView == null) {
453ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Log.e(TAG, "setWaveformExtractionProgress: audio track view not found: "
454ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    + audioTrackId);
455ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
456ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
457ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
45843006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        audioTrackView.setProgress(progress);
459ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
460ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
461ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
462ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * The waveform extraction is complete
463ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
464ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
465ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
466ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setWaveformExtractionComplete(String audioTrackId) {
467ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final AudioTrackView audioTrackView = (AudioTrackView)getAudioTrackView(audioTrackId);
468ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrackView == null) {
469ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            Log.e(TAG, "setWaveformExtractionComplete: audio track view not found: "
470ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    + audioTrackId);
471ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
472ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
473ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
47443006ed2a1946b0aefb895f8b1d67a0fc50d8937Gil Dobjanschi        audioTrackView.setProgress(-1);
475ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
476ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final MovieAudioTrack audioTrack = (MovieAudioTrack)audioTrackView.getTag();
477ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (audioTrack.getWaveformData() != null) {
478ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            audioTrackView.setWaveformData(audioTrack.getWaveformData());
479ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
480ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
481ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        requestLayout();
482ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        invalidate();
483ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
484ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
485ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
486ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * The timeline duration has changed. Refresh the view.
487ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
488ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void updateTimelineDuration() {
489ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        mTimelineDurationMs = mProject.computeDuration();
490ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
491ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Media items may had been added or removed
49248fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        updateAddAudioTrackButton();
493ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
494ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Update the project duration for all views
495ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int childrenCount = getChildCount();
496ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (int i = 0; i < childrenCount; i++) {
497ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View childView = getChildAt(i);
498ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieAudioTrack audioTrack = (MovieAudioTrack)childView.getTag();
499ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (audioTrack != null) {
500ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                ((AudioTrackView)childView).updateTimelineDuration(mTimelineDurationMs);
501ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
502ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
503ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
504ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        requestLayout();
505ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        invalidate();
506ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
507ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
508ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
509ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    protected void onLayout(boolean changed, int l, int t, int r, int b) {
510ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int childrenCount = getChildCount();
511ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mTimelineDurationMs == 0) {
512ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int left = 0;
513ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < childrenCount; i++) {
514ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final View childView = getChildAt(i);
515ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieAudioTrack audioTrack = (MovieAudioTrack)childView.getTag();
516ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (audioTrack != null) {
517ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    // Audio tracks are not visible
518ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    childView.layout(left, 0, left, mAudioTrackHeight);
519ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else { // Beginning and end views
520ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    childView.layout(left, 0, left + mHalfParentWidth, mAudioTrackHeight);
521ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    left += mHalfParentWidth;
522ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
523ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
524ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else {
525ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final int viewWidth = getWidth() - (2 * mHalfParentWidth);
526ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            int left = 0;
527ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
52897c784156f2df509683c59c6ce0e23ef5126a4b3Gil Dobjanschi            final int leftViewWidth = (Integer)((View)getParent().getParent()).getTag(
52997c784156f2df509683c59c6ce0e23ef5126a4b3Gil Dobjanschi                    R.id.left_view_width);
53048fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi
531ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            for (int i = 0; i < childrenCount; i++) {
532ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final View childView = getChildAt(i);
53348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                final int id = childView.getId();
534ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieAudioTrack audioTrack = (MovieAudioTrack)childView.getTag();
535ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (audioTrack != null) { // Audio track views
536ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int width;
537ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    if (audioTrack.isAppLooping()) {
538ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        width = (int)((mTimelineDurationMs -
539ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrack.getAppStartTime()) * viewWidth / mTimelineDurationMs);
540ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    } else {
541ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        if (audioTrack.getAppStartTime() + audioTrack.getTimelineDuration() >
542ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                mTimelineDurationMs) {
543ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            width = (int)((mTimelineDurationMs -
544ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrack.getAppStartTime()) * viewWidth / mTimelineDurationMs);
545ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        } else {
546ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            width = (int)(audioTrack.getTimelineDuration() * viewWidth /
547ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                    mTimelineDurationMs);
548ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        }
549ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
550ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
551ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    final int trackLeft =
552ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        (int)((audioTrack.getAppStartTime() * viewWidth) / mTimelineDurationMs) +
553ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                            leftViewWidth;
554ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    childView.layout(trackLeft, 0, trackLeft + width, mAudioTrackHeight);
555ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    left = trackLeft + width;
55648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                } else if (id == R.id.add_audio_track_button) {
55756c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                    if (childView.getVisibility() == View.VISIBLE) {
55856c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                        childView.layout(left, 0, left + mAddAudioTrackButtonWidth,
55956c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                                mAudioTrackHeight);
56056c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                        left += mAddAudioTrackButtonWidth;
56156c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                    }
562ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else if (i == 0) { // Begin view
56348fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                    childView.layout(left, 0, left + leftViewWidth, mAudioTrackHeight);
56448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                    left += leftViewWidth;
565ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                } else { // End view
56656c563d89b0d17510c3a81ac5d537bd1ef38ca65Gil Dobjanschi                    childView.layout(left, 0, getWidth(), mAudioTrackHeight);
567ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
568ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
569ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
570ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
571ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
572ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
573ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Create a new dialog
574ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
575ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param id The dialog id
576ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param bundle The dialog bundle
577ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
578ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The dialog
579ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
580ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public Dialog onCreateDialog(int id, final Bundle bundle) {
581ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // If the project is not yet loaded do nothing.
582ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (mProject == null) {
583ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return null;
584ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
585ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
586ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        switch (id) {
587ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            case VideoEditorActivity.DIALOG_REMOVE_AUDIO_TRACK_ID: {
588ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final MovieAudioTrack audioTrack = mProject.getAudioTrack(
589ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        bundle.getString(PARAM_DIALOG_AUDIO_TRACK_ID));
590ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                if (audioTrack == null) {
591ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    return null;
592ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }
593ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
594ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                final Activity activity = (Activity)getContext();
595ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return AlertDialogs.createAlert(activity,
596ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        FileUtils.getSimpleName(audioTrack.getFilename()), 0,
597ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        activity.getString(R.string.editor_remove_audio_track_question),
598ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        activity.getString(R.string.yes),
599ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        new DialogInterface.OnClickListener() {
600fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng                    @Override
601ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    public void onClick(DialogInterface dialog, int which) {
60248a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi                        if (mAudioTrackActionMode != null) {
60348a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi                            mAudioTrackActionMode.finish();
60448a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi                            mAudioTrackActionMode = null;
60548a89c6dcddd26cc95ce28440305e3aa729c4b0cGil Dobjanschi                        }
606ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_AUDIO_TRACK_ID);
607ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
608ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        ApiService.removeAudioTrack(activity, mProject.getPath(),
609ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                                audioTrack.getId());
610ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
611ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }, activity.getString(R.string.no), new DialogInterface.OnClickListener() {
612fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng                    @Override
613ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    public void onClick(DialogInterface dialog, int which) {
614ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_AUDIO_TRACK_ID);
615ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
616ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }, new DialogInterface.OnCancelListener() {
617fe7b065c18808ac3bd15ea5a1248b3af66b50fb7Shih-chia Cheng                    @Override
618ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    public void onCancel(DialogInterface dialog) {
619ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                        activity.removeDialog(VideoEditorActivity.DIALOG_REMOVE_AUDIO_TRACK_ID);
620ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    }
621ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                }, true);
622ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
623ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
624ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            default: {
625ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return null;
626ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
627ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
628ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
629ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
630ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
631ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Find the audio track view with the specified id
632ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
633ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param audioTrackId The audio track id
634ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @return The audio track view
635ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
636ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private View getAudioTrackView(String audioTrackId) {
637ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int childrenCount = getChildCount();
638ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (int i = 0; i < childrenCount; i++) {
639ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View childView = getChildAt(i);
640ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final MovieAudioTrack audioTrack = (MovieAudioTrack)childView.getTag();
641ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (audioTrack != null && audioTrackId.equals(audioTrack.getId())) {
642ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                return childView;
643ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
644ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
645ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
646ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        return null;
647ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
648ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
649ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
650ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Remove all audio track views (leave the beginning and end views)
651ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
65248fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi    private void removeAudioTrackViews() {
653ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        int index = 0;
654ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        while (index < getChildCount()) {
655ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final Object tag = getChildAt(index).getTag();
656ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (tag != null) {
657ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                removeViewAt(index);
658ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
659ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                index++;
660ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
661ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
662ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
663ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        requestLayout();
664ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
665ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
666ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
667ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Set the background of the begin view
668ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
66948fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi    private void updateAddAudioTrackButton() {
67048fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        if (mProject == null) { // No project
67148fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi            mAddAudioTrackButtonView.setVisibility(View.GONE);
672ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        } else if (mProject.getMediaItemCount() > 0) {
673ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mProject.getAudioTracks().size() > 0) {
67448fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                mAddAudioTrackButtonView.setVisibility(View.GONE);
675ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            } else {
67648fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi                mAddAudioTrackButtonView.setVisibility(View.VISIBLE);
677ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
67848fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi        } else { // No media items
67948fad560e9474e9e29447efa6866ee77987d7887Gil Dobjanschi            mAddAudioTrackButtonView.setVisibility(View.GONE);
680ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
681ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
682ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
683ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    @Override
684ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    public void setSelected(boolean selected) {
685ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (selected == false) {
686ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            // Close the contextual action bar
687ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            if (mAudioTrackActionMode != null) {
688ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mAudioTrackActionMode.finish();
689ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                mAudioTrackActionMode = null;
690ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            }
691ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
692ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
693ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        final int childrenCount = getChildCount();
694ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        for (int i = 0; i < childrenCount; i++) {
695ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            final View childView = getChildAt(i);
696ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            childView.setSelected(false);
697ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
698ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
699ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
700ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
701ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Select a view and unselect any view that is selected.
702ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     *
703ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param selectedView The view to select
704ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * @param selected true if selected
705ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
706ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void selectView(View selectedView, boolean selected) {
707ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Check if the selection has changed
708ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (selectedView.isSelected() == selected) {
709ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            return;
710ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
711ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
712ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (selected) {
713ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            unselectAllViews();
714ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
715ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
716ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        if (selected && mAudioTrackActionMode == null) {
717ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi            startActionMode(new AudioTrackActionModeCallback(
718ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi                    (MovieAudioTrack)selectedView.getTag()));
719ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        }
720ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
721ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        // Select the new view
722ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        selectedView.setSelected(selected);
723ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
724ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi
725ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    /**
726ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     * Unselect all views
727ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi     */
728ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    private void unselectAllViews() {
729ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi        ((RelativeLayout)getParent()).setSelected(false);
730ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi    }
731ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi}
732