package de.avalax.fitbuddy.presentation.edit.workout;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import de.avalax.fitbuddy.R;
import de.avalax.fitbuddy.application.edit.workout.EditWorkoutApplicationService;
import de.avalax.fitbuddy.domain.model.exercise.Exercise;
import de.avalax.fitbuddy.domain.model.exercise.ExerciseException;
import de.avalax.fitbuddy.domain.model.workout.Workout;
import de.avalax.fitbuddy.domain.model.workout.WorkoutException;
import de.avalax.fitbuddy.domain.model.workout.WorkoutId;
import de.avalax.fitbuddy.presentation.FitbuddyApplication;
import de.avalax.fitbuddy.presentation.edit.exercise.EditExerciseActivity;
public class ExerciseListFragment extends ListFragment {
@Inject
protected EditWorkoutApplicationService editWorkoutService;
private View footer;
private Workout workout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
((FitbuddyApplication) getActivity().getApplication()).getComponent().inject(this);
View view = inflater.inflate(R.layout.fragment_exercise_list, container, false);
footer = view.findViewById(R.id.footer_undo);
view.findViewById(R.id.button_undo).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
undoChanges();
} catch (WorkoutException e) {
Log.d("Can't undo", e.getMessage(), e);
}
}
});
view.findViewById(android.R.id.empty).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
addExercise();
} catch (WorkoutException e) {
Log.d("Can't create exercise", e.getMessage(), e);
}
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initContextualActionBar();
try {
initListView((WorkoutId) getArguments().getSerializable("workoutId"));
} catch (WorkoutException e) {
Log.d("Can't init fragment", e.getMessage(), e);
}
TextView textView = (TextView) getView().findViewById(R.id.unsavedChangesTextView);
if (editWorkoutService.hasDeletedExercise()) {
textView.setText(R.string.has_deleted_exercise);
} else if (editWorkoutService.hasDeletedWorkout()) {
textView.setText(R.string.has_deleted_workout);
}
}
private void initContextualActionBar() {
ExerciseModeListener listener = new ExerciseModeListener(workout, this, editWorkoutService);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
getListView().setMultiChoiceModeListener(listener);
}
protected void initListView(WorkoutId workoutId) throws WorkoutException {
int visibility = editWorkoutService.hasUnsavedChanges() ? View.VISIBLE : View.GONE;
footer.setVisibility(visibility);
workout = editWorkoutService.loadWorkout(workoutId);
List<Exercise> exercises = new ArrayList<>();
for (Exercise exercise : workout.getExercises()) {
exercises.add(exercise);
}
ListAdapter adapter = new ExerciseAdapter(getActivity(), R.layout.item_exercise, exercises);
setListAdapter(adapter);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
registerForContextMenu(getListView());
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
try {
Exercise exercise = workout.getExercises().get(position);
Intent intent = new Intent(getActivity(), EditExerciseActivity.class);
intent.putExtra("workoutId", workout.getWorkoutId());
intent.putExtra("exercise", exercise);
intent.putExtra("position", position);
getActivity().startActivityForResult(intent, EditWorkoutActivity.EDIT_EXERCISE);
} catch (ExerciseException e) {
Log.d("Can't edit exercise", e.getMessage(), e);
}
}
private void undoChanges() throws WorkoutException {
if (editWorkoutService.hasDeletedExercise()) {
editWorkoutService.undoDeleteExercise(workout);
} else if (editWorkoutService.hasDeletedWorkout()) {
editWorkoutService.undoDeleteWorkout();
((EditWorkoutActivity) getActivity()).initActionNavigationBar();
}
initListView(workout.getWorkoutId());
}
protected void addExercise() throws WorkoutException {
if (workout == null) {
workout = editWorkoutService.createWorkout();
((EditWorkoutActivity) getActivity()).initActionNavigationBar();
}
editWorkoutService.createExercise(workout);
initListView(workout.getWorkoutId());
}
}