package org.runnerup.view;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TableRow;
import org.json.JSONException;
import org.runnerup.R;
import org.runnerup.widget.TitleSpinner;
import org.runnerup.workout.RepeatStep;
import org.runnerup.workout.Step;
import org.runnerup.workout.Workout;
import org.runnerup.workout.WorkoutSerializer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@TargetApi(Build.VERSION_CODES.FROYO)
public class CreateAdvancedWorkout extends Activity {
Workout advancedWorkout = null;
TitleSpinner advancedWorkoutSpinner = null;
Button addStepButton = null;
Button addRepeatButton = null;
Button saveWorkoutButton = null;
Button discardWorkoutButton = null;
ListView advancedStepList = null;
final WorkoutStepsAdapter advancedWorkoutStepsAdapter = new WorkoutStepsAdapter();
boolean dontAskAgain = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.create_advanced_workout);
Intent intent = getIntent();
String advWorkoutName = intent.getStringExtra(ManageWorkoutsActivity.WORKOUT_NAME);
advancedWorkoutSpinner = (TitleSpinner) findViewById(R.id.new_workout_spinner);
advancedWorkoutSpinner.setValue(advWorkoutName + ".json");
advancedWorkoutSpinner.setEnabled(false);
dontAskAgain = false;
advancedStepList = (ListView) findViewById(R.id.new_advnced_workout_steps);
advancedStepList.setDividerHeight(0);
advancedStepList.setAdapter(advancedWorkoutStepsAdapter);
addStepButton = (Button) findViewById(R.id.add_step_button);
addStepButton.setOnClickListener(addStepButtonClick);
addRepeatButton = (Button) findViewById(R.id.add_repeat_button);
addRepeatButton.setOnClickListener(addRepeatStepButtonClick);
saveWorkoutButton = (Button) findViewById(R.id.workout_save_button);
saveWorkoutButton.setOnClickListener(saveWorkoutButtonClick);
discardWorkoutButton = (Button) findViewById(R.id.workout_discard_button);
discardWorkoutButton.setOnClickListener(discardWorkoutButtonClick);
try {
createAdvancedWorkout(advWorkoutName);
} catch (Exception e) {
handleWorkoutFileException(e);
}
}
private void createAdvancedWorkout(String name) throws JSONException, IOException {
advancedWorkout = new Workout();
WorkoutSerializer.writeFile(getApplicationContext(), name + ".json", advancedWorkout);
advancedWorkoutStepsAdapter.steps = advancedWorkout.getStepList();
advancedWorkoutStepsAdapter.notifyDataSetChanged();
}
@TargetApi(Build.VERSION_CODES.FROYO)
final class WorkoutStepsAdapter extends BaseAdapter {
List<Workout.StepListEntry> steps = new ArrayList<Workout.StepListEntry>();
@Override
public int getCount() {
return steps.size();
}
@Override
public Object getItem(int position) {
return steps.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
private class ViewHolderWorkoutStepsAdapter {
private StepButton button;
private Button add;
private Button del;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolderWorkoutStepsAdapter viewHolder;
if (view == null) {
viewHolder = new ViewHolderWorkoutStepsAdapter();
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.advanced_workout_row, parent, false);
viewHolder.button = (StepButton) view.findViewById(R.id.workout_step_button);
viewHolder.button.setOnChangedListener(onWorkoutChanged);
viewHolder.add = (Button) view.findViewById(R.id.add_button);
viewHolder.add.setOnClickListener(onAddButtonClick);
viewHolder.del = (Button) view.findViewById(R.id.del_button);
viewHolder.del.setOnClickListener(onDeleteButtonClick);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolderWorkoutStepsAdapter) view.getTag();
}
Workout.StepListEntry entry = steps.get(position);
viewHolder.button.setStep(entry.step);
viewHolder.button.setPadding(entry.level * 12, 0, 0, 0);
return view;
}
}
final View.OnClickListener onAddButtonClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
TableRow row = (TableRow) view.getParent();
final StepButton stepButton = (StepButton) row.findViewById(R.id.workout_step_button);
Step currentStep = stepButton.getStep();
if (currentStep instanceof RepeatStep) {
RepeatStep rs = (RepeatStep) currentStep;
rs.getSteps().add(new Step());
} else {
int index = advancedWorkout.getSteps().indexOf(currentStep);
if (index < 0) {
for (Step se : advancedWorkout.getSteps()) {
if (se instanceof RepeatStep) {
index = ((RepeatStep) se).getSteps().indexOf(currentStep);
((RepeatStep) se).getSteps().add(index + 1, new Step());
}
}
} else {
advancedWorkout.getSteps().add(index + 1, new Step());
}
}
advancedWorkoutStepsAdapter.steps = advancedWorkout.getStepList();
advancedWorkoutStepsAdapter.notifyDataSetChanged();
}
};
final View.OnClickListener onDeleteButtonClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
TableRow row = (TableRow) view.getParent();
final StepButton stepButton = (StepButton) row.findViewById(R.id.workout_step_button);
if(!dontAskAgain) {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateAdvancedWorkout.this);
builder.setMultiChoiceItems(new String[] {"Don't ask again"}, new boolean[] {dontAskAgain},
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) {
dontAskAgain = isChecked;
}
});
builder.setTitle(getString(R.string.Are_you_sure));
builder.setPositiveButton(getString(R.string.Yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
deleteStep(stepButton);
return;
}
});
builder.setNegativeButton(getString(R.string.No),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
});
builder.show();
} else {
deleteStep(stepButton);
}
}
private void deleteStep(StepButton button) {
Step s = button.getStep();
for (Step se : advancedWorkout.getSteps()) {
if (se instanceof RepeatStep) {
for (Step subStep : ((RepeatStep) se).getSteps()) {
if (subStep.equals(s)) {
((RepeatStep) se).getSteps().remove(s);
break;
}
}
}
if (se.equals(s)) {
advancedWorkout.getSteps().remove(se);
break;
}
}
advancedWorkoutStepsAdapter.steps = advancedWorkout.getStepList();
advancedWorkoutStepsAdapter.notifyDataSetChanged();
}
};
final Runnable onWorkoutChanged = new Runnable() {
@Override
public void run() {
String advWorkoutName = advancedWorkoutSpinner.getValue().toString();
if (advancedWorkout != null) {
Context ctx = getApplicationContext();
try {
WorkoutSerializer.writeFile(ctx, advWorkoutName, advancedWorkout);
} catch (Exception ex) {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateAdvancedWorkout.this);
builder.setTitle(getString(R.string.Failed_to_load_workout));
builder.setMessage("" + ex.toString());
builder.setPositiveButton(getString(R.string.OK),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
return;
}
}
}
};
final View.OnClickListener addStepButtonClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
advancedWorkout.addStep(new Step());
advancedWorkoutStepsAdapter.steps = advancedWorkout.getStepList();
advancedWorkoutStepsAdapter.notifyDataSetChanged();
}
};
final View.OnClickListener addRepeatStepButtonClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
advancedWorkout.addStep(new RepeatStep());
advancedWorkoutStepsAdapter.steps = advancedWorkout.getStepList();
advancedWorkoutStepsAdapter.notifyDataSetChanged();
}
};
final View.OnClickListener saveWorkoutButtonClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
String advWorkoutName = advancedWorkoutSpinner.getValue().toString();
WorkoutSerializer.writeFile(getApplicationContext(), advWorkoutName, advancedWorkout);
finish();
} catch (Exception e) {
handleWorkoutFileException(e);
}
}
};
private void handleWorkoutFileException(Exception e) {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateAdvancedWorkout.this);
builder.setTitle(getString(R.string.Failed_to_create_workout));
builder.setMessage("" + e.toString());
builder.setPositiveButton(getString(R.string.OK),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
return;
}
final View.OnClickListener discardWorkoutButtonClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
final AlertDialog.Builder builder = new AlertDialog.Builder(CreateAdvancedWorkout.this);
builder.setTitle("Delete workout?");
builder.setMessage(getString(R.string.Are_you_sure));
builder.setPositiveButton(getString(R.string.Yes),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
File f = WorkoutSerializer.getFile(getApplicationContext(), advancedWorkoutSpinner.getValue().toString());
//noinspection ResultOfMethodCallIgnored
f.delete();
finish();
return;
}
});
builder.setNegativeButton(getString(R.string.No),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
return;
}
});
builder.show();
return;
}
};
}