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