package com.vorsk.crossfitr;
import com.vorsk.crossfitr.models.SQLiteDAO;
import com.vorsk.crossfitr.models.WorkoutModel;
import com.vorsk.crossfitr.models.WorkoutRow;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class TabataActivity extends Activity {
private static final int TOTAL_TIME = 30000 * 8;
// View elements in stopwatch.xml
private TextView mWorkoutDescription, mStateLabel, mWorkoutName;
private Button mStartStop, mReset, mFinish;
private Time tabata = new Time();
private boolean newStart, cdRun, goStop;
private long id;
private static long set;
private MediaPlayer mp;
private boolean active = true;
private static boolean tabataFinished = false;
private WorkoutRow workout;
// Timer to update the elapsedTime display
private final long mFrequency = 100; // milliseconds
private final int TICK_WHAT = 2;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message m) {
if(!cdRun)
updateElapsedTime();
sendMessageDelayed(Message.obtain(this, TICK_WHAT), mFrequency);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TimerActivity.setTimerFinished(false);
StopwatchActivity.setStopwatchFinished(false);
setContentView(R.layout.tabata_tab);
cdRun = false;
//open model to put data into database
//get the id passed from previous activity (workout lists)
id = getIntent().getLongExtra("ID", -1);
//if ID is invalid, go back to home screen
if(id < 0)
{
getParent().setResult(RESULT_CANCELED);
finish();
}
newStart = true;
//create model object
WorkoutModel model = new WorkoutModel(this);
model.open();
workout = model.getByID(id);
Typeface roboto = Typeface.createFromAsset(getAssets(),"fonts/Roboto-Light.ttf");
mStateLabel = (TextView)findViewById(R.id.state_label);
mStateLabel.setTypeface(roboto);
mStateLabel.setText("Press To Start");
mStateLabel.setTextColor(Color.GREEN);
mWorkoutDescription = (TextView)findViewById(R.id.workout_des_time);
mWorkoutDescription.setMovementMethod(new ScrollingMovementMethod());
mWorkoutDescription.setTypeface(roboto);
mWorkoutDescription.setText(workout.description);
mWorkoutName = (TextView)findViewById(R.id.workout_name_time);
mWorkoutName.setText(workout.name);
mWorkoutName.setTypeface(roboto);
Resources res = getResources();
if (model.getTypeName(workout.workout_type_id).equals("WOD"))
mWorkoutName.setTextColor(res.getColor(R.color.wod));
else if (model.getTypeName(workout.workout_type_id).equals("Hero"))
mWorkoutName.setTextColor(res.getColor(R.color.heroes));
else if (model.getTypeName(workout.workout_type_id).equals("Girl"))
mWorkoutName.setTextColor(res.getColor(R.color.girls));
else if(model.getTypeName(workout.workout_type_id).equals("Custom"))
mWorkoutName.setTextColor(res.getColor(R.color.custom));
model.close();
mStartStop = (Button)findViewById(R.id.start_stop_button);
mStartStop.setTypeface(roboto);
mReset = (Button)findViewById(R.id.reset_button);
mReset.setTypeface(roboto);
mReset.setEnabled(false);
mFinish = (Button)findViewById(R.id.finish_workout_button);
mFinish.setTypeface(roboto);
mFinish.setEnabled(false);
setDisplayBackgroundColor(0);
tabataFinished = false;;
mHandler.sendMessageDelayed(Message.obtain(mHandler, TICK_WHAT), mFrequency);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void onStartStopClicked(View V) {
if(!tabata.isRunning()){
newStart = false;
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(0).setEnabled(false);
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(1).setEnabled(false);
playSound(R.raw.countdown_3_0);
cdRun = true;
new CountDownTimer(3000, 100) {
@Override
public void onTick(long millisUntilFinished) {
mStartStop.setText("" + (millisUntilFinished / 1000 + 1));
mStartStop.setEnabled(false);
mStateLabel.setText("");
setDisplayBackgroundColor(2);
mReset.setEnabled(false);
mFinish.setEnabled(false);
}
@Override
public void onFinish() {
goStop = true;
playSound(R.raw.bell_ring);
//mStartStop.setText("Go!");
tabata.start();
mStateLabel.setText("Press To Stop");
mStateLabel.setTextColor(Color.RED);
cdRun = false;
mStartStop.setEnabled(true);
}
}.start();
}
else{
tabata.stop();
newStart = false;
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(0).setEnabled(true);
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(1).setEnabled(true);
mStateLabel.setText("Press To Start");
mStateLabel.setTextColor(Color.GREEN);
mReset.setEnabled(true);
mFinish.setEnabled(true);
}
}
public void onResetClicked(View v) {
newStart = true;
tabata.reset();
mReset.setEnabled(false);
mFinish.setEnabled(false);
}
public void onFinishedClicked(View v) {
Intent result = new Intent();
tabataFinished = true;
result.putExtra("score_type", SQLiteDAO.NOT_SCORED);
result.putExtra("score", SQLiteDAO.NOT_SCORED);
if (workout.record_type_id == SQLiteDAO.SCORE_WEIGHT
|| workout.record_type_id == SQLiteDAO.SCORE_REPS) {
result.putExtra("score", getIntent().getIntExtra("score", 0));
}
getParent().setResult(RESULT_OK, result);
finish();
}
/**
*
* Returns true if the tabata finish button was clicked
* @return if tabata was finished
*/
public static boolean getTabataFinished(){
return tabataFinished;
}
public static void setTabataFinished(boolean state) {
tabataFinished = state;
}
/**
* method to do when 8 sets are done
*/
private void endTabata() {
newStart = true;
playSound(R.raw.boxing_bellx3);
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(0).setEnabled(true);
((TimeTabWidget) getParent()).getTabHost().getTabWidget().getChildTabViewAt(1).setEnabled(true);
tabata.reset();
mFinish.setEnabled(true);
}
public void updateElapsedTime() {
//if(!cdRun)
mStartStop.setText(getFormattedElapsedTime());
}
private String formatElapsedTime(long now, long set) {
long seconds = 0, tenths = 0;
StringBuilder sb = new StringBuilder();
if(newStart){
now = 20000;
}
if (now < 1000) {
tenths = now / 100;
} else if (now < 60000) {
seconds = now / 1000;
now -= seconds * 1000;
tenths = now / 100;
}
sb.append("SET : ").append(set).append("\n").append(formatDigits(seconds)).append(".").append(tenths);
return sb.toString();
}
private String formatDigits(long num) {
return (num < 10) ? "0" + num : new Long(num).toString();
}
public String getFormattedElapsedTime() {
long time = tabata.getElapsedTime();
set = 1 + ((int)time / 30000);
long diff = TOTAL_TIME - time;
long remain = diff % 30000;
//reset at end of set 8 workout. no last 10 sec break
if(diff <= 10000){
set = 1;
this.endTabata();
}
// if logic to display sets and time for tabata
if(remain > 10000 ){
if(!goStop){
if(tabata.isRunning()){
playSound(R.raw.bell_ring);
}
goStop = true;
}
setDisplayBackgroundColor(0);
return formatElapsedTime(20000 - (time % 30000), set);
}else if(remain == 10000){
return formatElapsedTime(0, set);
}else{
if(goStop){
if(diff > 20000 && tabata.isRunning()){
playSound(R.raw.air_horn);
}
goStop = false;
}
if(tabata.isRunning()){
setDisplayBackgroundColor(1);
}
return formatElapsedTime(30000 - (time % 30000), set);
}
}
/**
* The number of sets completed in tabata
* @return number of sets completed in tabata
*/
public static long getNumberSets(){
return set;
}
/**
* method to change background color
* @param int 0 for green, 1 for red, 2 for black
*/
private void setDisplayBackgroundColor(int color){
if(color == 0){
mStartStop.setBackgroundResource(R.drawable.tabata_display_go);
}
else if(color == 1){
mStartStop.setBackgroundResource(R.drawable.tabata_display_rest);
}
else if(color == 2){
mStartStop.setBackgroundResource(R.drawable.background_main);
}
}
/**
* method to play sound file
* @param r
*/
private void playSound(int r) {
//Release any resources from previous MediaPlayer
if (mp != null) {
mp.release();
}
if(active){
// Create a new MediaPlayer to play this sound
mp = MediaPlayer.create(this, r);
mp.start();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mp != null) {
mp.release();
}
active = false;
}
}