package com.uw.ictd.respeak;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import android.app.Fragment;
import android.app.FragmentManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class TrainingFragment extends Fragment {
public static int REQUEST_CODE = 100;
private static final String DIALOG_TRAINING = "Welcome dialog";
private static final String DIALOG_SUBMISSION = "Submission dialog";
private TextView mTrainingText;
private Button mRecordButton;
private ImageButton mRecordImageButton;
private Button mDoneButton;
private ImageButton mDoneImageButton;
private TextView mYourRecording;
private TextView mAudioCurrentDurationTraining;
private TextView mAudioTotalDurationTraining;
private SeekBar mAudioProgressBarTraining;
private ImageButton mRecordAgainButton;
private ImageButton mSubmitButton;
private ImageButton mPlayButtonTraining;
private Uri mRecordedFile;
private AudioRecorder mRecorder = new AudioRecorder();
private AudioPlayer mPlayer;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getActivity().getFragmentManager();
TrainingWelcomDialogFragment dialog = new TrainingWelcomDialogFragment();
dialog.show(fm, DIALOG_TRAINING);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_training, parent, false);
mTrainingText = (TextView) v.findViewById(R.id.trainingText);
mTrainingText.setText(readText());
mTrainingText.setMovementMethod(new ScrollingMovementMethod());
mRecordButton = (Button) v.findViewById(R.id.recordButtonTrain);
mRecordImageButton = (ImageButton) v
.findViewById(R.id.recordImageButtonTrain);
mDoneButton = (Button) v.findViewById(R.id.doneButtonTrain);
mDoneImageButton = (ImageButton) v
.findViewById(R.id.doneImageButtonTrain);
disableDoneButton();
mYourRecording = (TextView) v.findViewById(R.id.yourRecording);
mAudioCurrentDurationTraining = (TextView) v
.findViewById(R.id.audioCurrentDurationTraining);
mAudioTotalDurationTraining = (TextView) v
.findViewById(R.id.audioTotalDurationTraining);
mAudioProgressBarTraining = (SeekBar) v
.findViewById(R.id.audioProgressBarTraining);
mPlayButtonTraining = (ImageButton) v
.findViewById(R.id.playButtonTraining);
mRecordAgainButton = (ImageButton) v.findViewById(R.id.recordAgainButton);
mSubmitButton = (ImageButton) v.findViewById(R.id.submitButton);
hidePlayBack();
// Starts recording
// TODO: start timer when you press record
OnClickListener recordListener = new OnClickListener() {
@Override
public void onClick(View v) {
mRecorder.startRecording();
mTrainingText
.setBackgroundResource(R.color.light_red_background);
disableRecordButton();
enableDoneButton();
// if (!mRecorder.isRecording()) {
// mRecorder.startRecording();
// mRecordImageButton
// .setBackgroundResource(R.drawable.pause_large);
// mRecordButton.setText("pause");
// enableDoneButton();
// } else {
// mRecorder.pauseRecording();
// // disableRecordButton();
// mRecordImageButton.setBackgroundResource(R.drawable.record);
// mRecordButton.setText("record");
// }
}
};
mRecordButton.setOnClickListener(recordListener);
mRecordImageButton.setOnClickListener(recordListener);
// Stops recording
// TODO: stop timer when you press record
OnClickListener doneListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (mRecorder != null) {
mRecorder.stopRecording();
mTrainingText.setBackgroundResource(R.color.lighter_gray);
mTrainingText.scrollTo(0, 0);
disableDoneButton();
enableRecordButton();
hideRecording();
showPlayBack();
// Get the name of the recorded file and initialize the audio player
mRecordedFile = Uri.parse(mRecorder.getFileName());
mPlayer = new AudioPlayer(mRecordedFile);
// Intent i = new Intent(getActivity(),
// SubmissionActivity.class);
// i.putExtra(SubmissionActivity.EXTRA_RECORDED_FILE_NAME,
// mRecorder.getFileName());
// Bundle bundle = getActivity().getIntent().getExtras();
// if (bundle != null) {
// i.putExtras(bundle);
// }
// startActivityForResult(i, REQUEST_CODE);
}
}
};
mDoneButton.setOnClickListener(doneListener);
mDoneImageButton.setOnClickListener(doneListener);
// Allows user to play/pause recording
mPlayButtonTraining.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.play(getActivity());
if (mPlayer.isPlaying()) {
// Update progress bar and total time
updateProgressBar();
long totalDuration = mPlayer.getDuration();
mAudioTotalDurationTraining.setText(TimeConverter
.milliSecondsToTimer(totalDuration));
mPlayButtonTraining.setBackgroundResource(R.drawable.pause);
} else {
mPlayButtonTraining.setBackgroundResource(R.drawable.play);
}
}
});
// Set listener on audio progress bar that tracks user's touch
OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Progress bar no longer updates
mHandler.removeCallbacks(mUpdateTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
int totalDuration = (int) mPlayer.getDuration();
int currentPosition = TimeConverter.progressToTimer(
seekBar.getProgress(), totalDuration);
// Move audio player forward or backward appropriate number of
// seconds
mPlayer.seekTo(currentPosition);
// Update timers
updateProgressBar();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
};
mAudioProgressBarTraining
.setOnSeekBarChangeListener(seekBarChangeListener);
mRecordAgainButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.stop();
mPlayButtonTraining.setBackgroundResource(R.drawable.play);
hidePlayBack();
showRecording();
}
});
mSubmitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.pause();
mPlayButtonTraining.setBackgroundResource(R.drawable.play);
FragmentManager fm = getActivity().getFragmentManager();
TrainingSubmissionDialogFragment dialog = new TrainingSubmissionDialogFragment(getActivity());
dialog.show(fm, DIALOG_SUBMISSION);
}
});
return v;
}
// Reads from a training text file and converts into a string
private String readText() {
InputStream inputStream = getResources().openRawResource(
R.raw.training_text);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int i;
try {
i = inputStream.read();
while (i != -1) {
outputStream.write(i);
i = inputStream.read();
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return outputStream.toString();
}
private void disableDoneButton() {
mDoneButton.setEnabled(false);
mDoneButton.setTextColor(getResources().getColor(R.color.light_gray));
mDoneImageButton.setEnabled(false);
mDoneImageButton.setBackgroundResource(R.drawable.done_gray);
}
private void enableDoneButton() {
mDoneButton.setEnabled(true);
mDoneButton.setTextColor(getResources().getColor(R.color.light_blue));
mDoneImageButton.setEnabled(true);
mDoneImageButton.setBackgroundResource(R.drawable.done_black);
}
private void disableRecordButton() {
mRecordButton.setEnabled(false);
mRecordButton.setTextColor(getResources().getColor(R.color.light_gray));
mRecordImageButton.setEnabled(false);
mRecordImageButton.setBackgroundResource(R.drawable.record_gray);
}
private void enableRecordButton() {
mRecordButton.setEnabled(true);
mRecordButton.setTextColor(getResources().getColor(R.color.light_blue));
mRecordImageButton.setEnabled(true);
mRecordImageButton.setBackgroundResource(R.drawable.record);
}
private void hidePlayBack() {
mYourRecording.setVisibility(View.GONE);
mAudioCurrentDurationTraining.setVisibility(View.GONE);
mAudioTotalDurationTraining.setVisibility(View.GONE);
mAudioProgressBarTraining.setVisibility(View.GONE);
mPlayButtonTraining.setVisibility(View.GONE);
mRecordAgainButton.setVisibility(View.GONE);
mSubmitButton.setVisibility(View.GONE);
}
private void hideRecording() {
mRecordButton.setVisibility(View.GONE);
mRecordImageButton.setVisibility(View.GONE);
mDoneButton.setVisibility(View.GONE);
mDoneImageButton.setVisibility(View.GONE);
}
private void showPlayBack() {
mYourRecording.setVisibility(View.VISIBLE);
mAudioCurrentDurationTraining.setVisibility(View.VISIBLE);
mAudioTotalDurationTraining.setVisibility(View.VISIBLE);
mAudioProgressBarTraining.setVisibility(View.VISIBLE);
mPlayButtonTraining.setVisibility(View.VISIBLE);
mRecordAgainButton.setVisibility(View.VISIBLE);
mSubmitButton.setVisibility(View.VISIBLE);
}
private void showRecording() {
mRecordButton.setVisibility(View.VISIBLE);
mRecordImageButton.setVisibility(View.VISIBLE);
mDoneButton.setVisibility(View.VISIBLE);
mDoneImageButton.setVisibility(View.VISIBLE);
}
// Update timer and audio progress bar
private void updateProgressBar() {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
// Thread to update timers
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long currentDuration = mPlayer.getCurrentPosition();
long totalDuration = mPlayer.getDuration();
// Update the current audio duration label
mAudioCurrentDurationTraining.setText(TimeConverter
.milliSecondsToTimer(currentDuration));
// Update the progress bar
int progress = TimeConverter.getProgressPercentage(currentDuration,
totalDuration);
mAudioProgressBarTraining.setProgress(progress);
// Run this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}
};
@Override
public void onPause() {
super.onPause();
mRecorder.stopRecording();
if (mPlayer != null) {
mPlayer.stop();
}
}
}