/**
*
* @author Martin Roth (mhroth@rjdj.me)
* @author Peter Brinkmann (peter.brinkmann@gmail.com)
*
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.
*
*/
package org.puredata.android.scenes;
import java.io.File;
import org.puredata.android.scenes.SceneDataBase.RecordingColumn;
import org.puredata.android.scenes.SceneDataBase.SceneColumn;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class RecordingPlayer extends Activity implements OnSeekBarChangeListener, OnCheckedChangeListener, OnClickListener {
private SceneDataBase db;
private long recordingId;
private long sceneId;
private String description;
private ToggleButton playButton;
private ImageButton sceneButton;
private ImageButton editButton;
private TextView descriptionView;
private SeekBar seekBar;
private MediaPlayer mediaPlayer;
private boolean playbackState;
private Thread updateThread = null;
private Toast toast = null;
private void toast(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (toast == null) {
toast = Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT);
}
toast.setText(msg);
toast.show();
}
});
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.recording_player);
db = new SceneDataBase(this);
recordingId = this.getIntent().getLongExtra(RecordingColumn.ID.getLabel(), -1);
if (recordingId >= 0) {
Cursor cursor = db.getRecording(recordingId);
sceneId = SceneDataBase.getLong(cursor, RecordingColumn.SCENE_ID);
displaySceneInfo(sceneId);
seekBar = (SeekBar) findViewById(R.id.recording_play_seekbar);
seekBar.setMax((int) SceneDataBase.getLong(cursor, RecordingColumn.RECORDING_DURATION));
seekBar.setOnSeekBarChangeListener(this);
descriptionView = (TextView) findViewById(R.id.recording_play_description_text);
description = SceneDataBase.getString(cursor, RecordingColumn.RECORDING_DESCRIPTION);
descriptionView.setText(description);
TextView textView = (TextView) findViewById(R.id.recording_play_duration_text);
String durationFormat = this.getString(R.string.duration_format);
textView.setText(DateFormat.format(durationFormat, SceneDataBase.getLong(cursor, RecordingColumn.RECORDING_DURATION)));
textView = (TextView) findViewById(R.id.recording_play_date_text);
String dateFormat = this.getString(R.string.date_format);
textView.setText(DateFormat.format(dateFormat, SceneDataBase.getLong(cursor, RecordingColumn.RECORDING_TIMESTAMP)));
textView = (TextView) findViewById(R.id.recording_play_latitude_text);
textView.setText("" + SceneDataBase.getDouble(cursor, RecordingColumn.RECORDING_LATITUDE));
textView = (TextView) findViewById(R.id.recording_play_longitude_text);
textView.setText("" + SceneDataBase.getDouble(cursor, RecordingColumn.RECORDING_LONGITUDE));
playButton = (ToggleButton) findViewById(R.id.recording_play_play_button);
playButton.setOnCheckedChangeListener(this);
playButton.setChecked(true);
sceneButton = (ImageButton) findViewById(R.id.recording_play_scene_button);
sceneButton.setOnClickListener(this);
editButton = (ImageButton) findViewById(R.id.recording_play_rename_button);
editButton.setOnClickListener(this);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(true);
String recPath = SceneDataBase.getString(cursor, RecordingColumn.RECORDING_PATH);
cursor.close();
try {
mediaPlayer.setDataSource(recPath);
mediaPlayer.prepare();
} catch (Exception e) {
toast(getResources().getString(R.string.open_recording_fail));
finish();
}
} else {
toast(getResources().getString(R.string.no_such_recording));
finish();
}
}
private void displaySceneInfo(long sceneId) {
Cursor cursor = db.getScene(sceneId);
if (cursor.getCount() > 0) {
TextView textView = (TextView) findViewById(R.id.recording_play_title);
textView.setText(SceneDataBase.getString(cursor, SceneColumn.SCENE_TITLE));
textView = (TextView) findViewById(R.id.recording_play_artist);
textView.setText(SceneDataBase.getString(cursor, SceneColumn.SCENE_ARTIST));
String scenePath = SceneDataBase.getString(cursor, SceneColumn.SCENE_DIRECTORY);
ImageView imageView = (ImageView) findViewById(R.id.recording_play_image);
imageView.setImageBitmap(BitmapFactory.decodeFile(new File(scenePath, "image.jpg").getAbsolutePath()));
}
cursor.close();
}
@Override
protected void onResume() {
super.onResume();
if (playButton.isChecked()) {
startPlayback();
}
}
@Override
protected void onPause() {
super.onPause();
stopPlayback();
}
@Override
protected void onDestroy() {
super.onDestroy();
mediaPlayer.release();
db.close();
}
private void startPlayback() {
startUpdateThread();
mediaPlayer.start();
}
private void stopPlayback() {
mediaPlayer.pause();
stopUpdateThread();
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
playbackState = mediaPlayer.isPlaying();
stopPlayback();
}
public void onStopTrackingTouch(SeekBar seekBar) {
if (playbackState) {
startPlayback();
}
}
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
startPlayback();
} else {
stopPlayback();
}
}
public void onClick(View v) {
if (v.equals(sceneButton)) {
Intent intent = new Intent(RecordingPlayer.this, ScenePlayer.class);
intent.putExtra(SceneColumn.ID.getLabel(), sceneId);
startActivity(intent);
} else if (v.equals(editButton)) {
editDescription();
}
}
private void editDescription() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setIcon(R.drawable.transport_edit_description);
dialog.setTitle(getResources().getString(R.string.description));
dialog.setMessage(getResources().getString(R.string.edit_description));
final EditText editText = new EditText(this);
editText.setText(description);
dialog.setView(editText);
dialog.setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
description = editText.getText().toString();
descriptionView.setText(description);
db.setRecordingDescription(recordingId, description);
}
});
dialog.setNegativeButton(getResources().getString(android.R.string.cancel), null);
dialog.show();
}
private void startUpdateThread() {
stopUpdateThread();
updateThread = new Thread() {
@Override
public void run() {
while (!isInterrupted()) {
seekBar.setProgress(mediaPlayer.getCurrentPosition());
try {
Thread.sleep(250);
} catch (InterruptedException e) {
break;
}
}
};
};
updateThread.start();
}
private void stopUpdateThread() {
if (updateThread != null) {
updateThread.interrupt();
try {
updateThread.join();
} catch (InterruptedException e) {
// Don't care.
}
updateThread = null;
}
}
}